今回は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の参照方式でかなり重要な要素なので積極的に取り入れていきたい。