今回はpandasのシリーズやデータフレームを扱う上で、重要なデータ操作方法を紹介する。
コンテンツ
シリーズのインデックス参照
シリーズのインデックス参照は、PythonのリストやNumPyのndarray同様、角括弧を使う。
import pandas as pd
import numpy as np
series = pd.Series(np.arange(5))
series[2] # 2
また、下記のようにインデックス値を指定して値を参照することも可能だ。
import pandas as pd
import numpy as np
series = pd.Series(np.arange(5), index=['a', 'b', 'c', 'd', 'e'])
series['c'] # 2
series[['e', 'a']]
# e 4
# a 0
# dtype: int64
条件による真偽値を使うこともできる。
series[series > 2]
# d 3
# e 4
# dtype: int64
ラベルを使ったスライシング
ラベルを使ってスライシングをすることもできるが、Python標準のスライシングとは動作が異なる点に注意が必要だ。
import pandas as pd
import numpy as np
series = pd.Series(np.arange(5), index=['a', 'b', 'c', 'd', 'e'])
series['b':'d']
# b 1
# c 2
# d 3
# dtype: int64
data = np.arange(5)
data[1:3]
# array([1, 2])
# 通常のスライシングは終点が含まれない
データフレームのインデックス参照
データフレームに対してインデックス参照をおこなうと、データフレームから任意の列を取得することができる。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(15).reshape(3, 5), columns=['a', 'b', 'c', 'd', 'e'])
# a b c d e
# 0 0 1 2 3 4
# 1 5 6 7 8 9
# 2 10 11 12 13 14
df['c']
# 0 2
# 1 7
# 2 12
# Name: c, dtype: int64
df[['b', 'd']]
# b d
# 0 1 3
# 1 6 8
# 2 11 13
スライシングによる行の取得
行を取得する場合は、スライシングを使う方法がある。
df[0:1]
# a b c d e
# 0 0 1 2 3 4
df[:3]
# a b c d e
# 0 0 1 2 3 4
# 1 5 6 7 8 9
# 2 10 11 12 13 14
真偽値による行の取得
また、真偽値を渡すことにより行を取得することもできる。
df[df['b'] > 5]
# a b c d e
# 1 5 6 7 8 9
# 2 10 11 12 13 14
loc・ilocによるデータの選択
行を選択する場合、locやilocを使う方法もある。
locは行列をインデックスラベル(名)で取り出し、ilocは行列をインデックス番号で取り出す。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(15).reshape(3, 5), columns=['a', 'b', 'c', 'd', 'e'])
# a b c d e
# 0 0 1 2 3 4
# 1 5 6 7 8 9
# 2 10 11 12 13 14
df.loc[0]
# a 0
# b 1
# c 2
# d 3
# e 4
# Name: 0, dtype: int64
df.loc[0, 'b']
# 1
df.loc[0, ['a', 'c']]
# a 0
# c 2
# Name: 0, dtype: int64
df.loc[0, :'b']
# a 0
# b 1
# Name: 0, dtype: int64
df.iloc[0, 4]
# 4
df.iloc[0, [1, 3]]
# b 1
# d 3
# Name: 0, dtype: int64
df.iloc[0, :3]
# a 0
# b 1
# c 2
# Name: 0, dtype: int64
まとめ
今回紹介したようにデータフレームの要素へアクセスする方法には様々な手段が用意されている。
複数要素を簡潔なコードで取得できるスライシングは、慣れるまで時間がかかったが、Pythonの参照方式でかなり重要な要素なので積極的に取り入れていきたい。