最近pythonを勉強していて、その忘備録としてこの記事を書いております。
pythonのDataframeからデータを取り出す方法はいくつかあるのでこの記事にまとめておきます。
下記リンクを参考にしております。
pandas - Python Data Analysis Library
今回使用するDataframeは以下の通り。
#サンプルデータ
date = {'A':[10,20,30],'B':[40,50,60], 'c':[70,80,90]}
df = pd.DataFrame(date, index=['row1','row2','row3'])
.loc
機能: ラベルやブール配列によって、行や列のグループにアクセスする。
※ラベル: 列や行の名前
ブールデータ配列: 0か1かで表現されるデータ。TrueやFalseであらわされることが多い。
許される入力としては;
- 一つのラベル
df.loc['row1']
df.loc['row2']
#この際にラベルに書かれていない数字などを入力するとエラーを吐かれるので注意
#列を取り出す場合
df.loc[:,'A']
df.loc[:,'B']
- ラベルの配列やリスト
df.loc[['row1','row2']]
#この際、[]を一つにすると行の次元が合わなくなり、エラーが吐かれるので注意
#入力が'row2','row1'のように逆だったとしても'row1','row2'で出力してくれる
列を取り出す場合
df.loc[:,['A','B']]
- ラベルのスライス
df.loc['row1':'row3']
列を取り出す場合
df.loc[:,'A':'C']
- 長さが同じのブール配列
df.loc[[True, False, True]]
#この際、TrueやFalseを2つしか入力しないと列の数と合わなくなるのでエラーになる。
#列を取り出す場合
df.loc[:, [True, False, True]]
- 整列可能なブール型のSeries
ブール型のSeriesを入力することができる。また、この際のindexの配列がめちゃくちゃであっても、それを順番に整えてからブールを判定しoutしてくれる。
df.loc[pd.Series([False, True, False], index=['row3','row2','row1'])]
#このようなindexの配列であっても出力可能
- 条件式
df.loc[df['B']>40]
#条件を加えることも可能
df.loc[(df['B']>40) & (df['c']>80)]
#条件を満たす別の列を取り出すことも可能
df.loc[df['B']>40, ['C']]
#行で条件式を適用して取り出すことはできないので、その場合は後述の.ilocを使用するとよい
.iloc
機能: 入力した整数によって行や列のグループにアクセスする。
許される入力としては;
- 整数
df.iloc[2]
#Dataframeは0スタートで数える
#この場合はリストで返される
df.iloc[[2]]
#2重かっこにするとDataframeで返してくれる
- 整数の配列
df.iloc[1,2]
df.iloc[[0,2], [0,1]]
- スライス
df.iloc[0:2]
#スライスを使用する際、
左側はスタート位置、右側は終わり位置を表しており、この場合0≦x<2を表すので0と1が選択されている
#特定の行列の取得も可能
df.iloc[1, 1:2]
- ブール配列
df.iloc[[True, False, True]]
まとめ
Dataframeからデータを取り出す方法の代表として.iocと.ilocがあり、下記のように使い分けられる。
操作 | loc (ラベルベース) | iloc (整数ベース) |
1行取得 | df.loc[‘row1’] | df.iloc[0] |
1列取得 | df.loc[:, ‘A’] | df.iloc[:, 0] |
1セル取得 | df.loc[‘row1’, ‘A’] | df.iloc[0, 0] |
複数行取得 | df.loc[[‘row1’, ‘row2’]] | df.iloc[[0, 1]] |
複数列取得 | df.loc[:, [‘A’, ‘B’]] | df.iloc[:, [0, 1]] |
スライス | df.loc[‘row1’: ‘row2’] | df.iloc[0:3] |
条件で取得 | df.loc[df[‘A’] >= 20 ] | ※使えない |
※lambdaや関数定義で、先にindexを取得しておけば条件を利用可能になる。
コメント