20分で理解するpandasの使い方(基礎)

pandasとは?

pandasはデータの操作や解析を行うためのPythonのライブラリです。

pandasが使われる理由

素のPythonでもリストやディクショナリで頑張って同じ操作を行うことはできますが、遅すぎて大きなデータの場合は使い物になりません。そこで登場したのが、pandasです。CythonおよびCによって開発されているため、非常に高速に動作します

アメリカのWeb McKinney氏によって2008年に開発されました。
名前の由来は統計学におけるパネル・データ(panel data)という用語だそうです。パ○ダじゃないですよ。

Pythonでデータマイニングや機械学習などを行う人には必須のライブラリですね。
この記事では、pandasの基本的な使い方をざっと理解していただくことができます。

パッケージインポート

import pandas as pd

データフレームを作る

# 二次元配列から作成
import numpy as np
pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6]]))
0 1 2
0 1 2 3
1 4 5 6
#  ディクショナリから作成
pd.DataFrame({1: ['1', '3'], 2: ['1', '2'], 3: ['2', '4']})
1 2 3
0 1 1 2
1 3 2 4
#  data, index, columnsを指定して作成
pd.DataFrame(data=[4,5,6,7], index=range(0,4), columns=['A'])
A
0 4
1 5
2 6
3 7
# Seriesから作成
my_series = pd.Series({"Tokyo":"Shinjuku", "Osaka":"Osaka",\
                       "Kyoto":"Kyoto", "Aichi":"Nagoya"})
display(pd.DataFrame(my_series, columns=['City']))
City
Aichi Nagoya
Kyoto Kyoto
Osaka Osaka
Tokyo Shinjuku

行・列数を取得する

# データフレームの行・列数を取得
df = pd.DataFrame(np.array([[4, 5, 6, 7], [4, 5, 6, 7], [4, 5, 6, 7]]),\
                          columns=np.array(["a", "b", "c", "d"]))
disply(df)
print(df.shape)
print('行数:', df.shape[0])
print('列数:', df.shape[1])
print('行数:', len(df.index))
print('列数:', len(df.columns))
a b c d
0 4 5 6 7
1 4 5 6 7
2 4 5 6 7

(3, 4)
行数: 3
列数: 4
行数: 3
列数: 4

行、列を指定してデータを選択する(loc, iloc, at)

loc,iloc,atにインデックス(行)、カラム(列)の順で添え字を指定することで目的のデータを取得できます。
iloc, iatはカラムを数値で指定します。

# 行を選択(loc, iloc)

df = pd.DataFrame(data=["apple","orange","grape","pineapple"], columns=['name'], index=range(4))

# Using `loc[]`
print(df.loc[0]['name'])

# Using `iloc[]`
print(df.iloc[1][0])

# Using `at[]`
print(df.at[2,'name'])

# Using `iat[]`
print(df.iat[3,0])

apple
orange
grape
pineapple

行の範囲、列を指定してデータを選択する

# Fetching data from DataFrame with ":"

df = pd.DataFrame(data={"name":["apple","orange","grape","pineapple"], "price":[100,200,140,120]})
df
name price
0 apple 100
1 orange 200
2 grape 140
3 pineapple 120
# `loc[]`を使って特定の列のデータを取得する
df.loc[2:, ]
name price
2 grape 140
3 pineapple 120
# `loc[]`を使って特定の行・列のデータを取得する
df.loc[:,'price'].to_frame()
price
0 100
1 200
2 140
3 120

インデックスを指定して、特定のデータを取得する

# set_index
df = pd.DataFrame(data={"name":["apple","orange","grape","pineapple"], "price":[100,200,140,120]})
display(df)
df = df.set_index('name')
print("price of grape:", df.loc['grape', 'price'])
name price
0 apple 100
1 orange 200
2 grape 140
3 pineapple 120

price of grape: 140

データを追加する

# データを追加する
df = pd.DataFrame(data={"name":["apple","orange"], "price":[100,200]})

# インデックスを指定する
df.set_index('name', inplace=True)
display(df)

# データを追加する
df.loc["strawbelly"] = [500]
df
price
name
apple 100
orange 200
price
name
apple 100
orange 200
strawbelly 500

列を追加する

# 列を追加する
df = pd.DataFrame(data={"name":["apple","orange"], "price":[100,200]})
df['location'] = ["Aomori", "Ehime"]
df
name price location
0 apple 100 Aomori
1 orange 200 Ehime

loc[]を使ってデータを書き換える

# データを書き換える
df = pd.DataFrame(data={"name":["apple","orange"], "price":[100,200]})
df.loc[1, 'price'] = 300
df
name price
0 apple 100
1 orange 300

行・列を削除する

df = pd.DataFrame(data={"name":["apple","orange"], "price":[100,200]})
display(df)
# 列を削除する場合はaxis = 1
display(df.drop('price', axis=1))
# 行を削除する場合はaxis = 0
# inplaceにTrueをセットすることで対象自体を変更できる
df.drop(0, axis=0, inplace=True)
df
name price
0 apple 100
1 orange 200
name
0 apple
1 orange
name
1 orange

重複を削除する

# 重複を削除する
df = pd.DataFrame(data={"name":["apple","orange","apple"], "price":[100,200,105]})
display(df)
df.drop_duplicates(['name'], keep='last', inplace=True)
df
name price
0 apple 100
1 orange 200
2 apple 105
name price
1 orange 200
2 apple 105

カラム名(列名)を変更する

df = pd.DataFrame(data={"name":["apple","orange"], "price":[100,200]})
df.rename(columns={'price': 'quantity'})
name quantity
0 apple 100
1 orange 200

データを置き換える(単純置換・正規表現)

# 正規表現で置換する
df = pd.DataFrame({'Region': ['Osaka', 'Tokyo', 'Aichi'], \
                                   'Speciality': ['Okonomiyaki\nI like it.', 'Monja\r\nI like it.', 'Misokatsu\r\nI hate it.']})
display(df)
df.replace({'\n|\r\n':'<br />'}, regex=True)
Region Speciality
0 Osaka Okonomiyaki\nI like it.
1 Tokyo Monja\r\nI like it.
2 Aichi Misokatsu\r\nI hate it.
Region Speciality
0 Osaka Okonomiyaki<br />I like it.
1 Tokyo Monja<br />I like it.
2 AIchi Misokatsu<br />I hate it.

ピボットテーブル(pivot_table)

生徒の点数を、クラス別、性別ごとに集計し、平均点を出してみる、といった操作も簡単です。

df = pd.DataFrame(data={"name":["yamada","sato","takahashi","takeda","kishi"], \
                                              "score":[100,80,40,70,90],\
                                              "sex":['Male', 'Male', 'Female', 'Female', 'Male'],\
                                              "class":['A', 'A', 'B', 'B', 'A']})
display(df)
df.pivot_table(index=['class', 'sex'], values='score', aggfunc='mean')
class name score sex
0 A yamada 100 Male
1 A sato 80 Male
2 B takahashi 40 Female
3 B takeda 70 Female
4 A kishi 90 Male
score
class sex
A Male 90
B Female 55

行をイテレートする

df = pd.DataFrame(data={"name":["yamada","sato","takahashi","takeda","kishi"], \
                                              "score":[100,80,40,70,90],\
                                              "sex":['Male', 'Male', 'Female', 'Female', 'Male'],\
                                              "class":['A', 'A', 'B', 'B', 'A']})
for index, row in df.iterrows():
    print("Score of", df.loc[index, 'name'], "=", df.loc[index, 'score'])

Score of yamada = 100
Score of sato = 80
Score of takahashi = 40
Score of takeda = 70
Score of kishi = 90

まとめ

その他にもたくさんの便利なデータ操作のAPIがありますので、適宜pandasのAPIリファレンスを見てください。

統計的な数値(平均、標準偏差など)の算出については後日追記したいと思います。

Please follow and like us:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です