今回はデータフレームで行・列・要素を指定して取得する方法をまとめてみました。
主な方法は4つ「loc・iloc・at・iat」です。
それぞれでできることやできないことがあるので一つ一つ見ていきましょう。
今回は以下のデータフレームを使っていきます。
1 2 3 4 5 6 7 8 |
df = pd.DataFrame( data={'col1': [10, 20, 30, 40], 'col2': [50, 60, 70, 80], 'col3': ['a', 'b', 'c', 'd']}, index=['row1', 'row2', 'row3', 'row4'] ) df |
loc・iloc・at・iatの特徴
行番号や列番号は行・列に対して0、1、…と自動的に割り振られています。
上のDataFrameの場合行番号は0~3、列番号は0~2になります。
おそらく、loc
はlocationでi
はindexという意味なんだと思います。
なので、i
がついているものは番号で指定するということでしょう。
行を指定する方法
df.loc[行名]
df.iloc[行番号]
- at、iatは使えない
例えば、1行目を指定する方法は2つです。row1の行番号は0です。
1 2 3 4 5 6 7 8 9 10 11 |
#行名を渡す df.loc['row1'] #行番号を渡す df.iloc[0] #出力 col1 10 col2 50 col3 a Name: row1, dtype: object |
最終行を指定する方法
iloc
の場合は行番号を渡しているので、-1を指定すると最終行を取得することができます。
リストのインデックスと似ていますね。
1 2 3 4 5 6 7 8 |
#最終行を指定 df.iloc[-1] #出力結果 col1 40 col2 80 col3 d Name: row4, dtype: object |
行をスライスする方法
df.loc[ 行名 : 行名 ]
df.iloc[ 行番号 : 行番号 ]
- at、iatは使えない
1 2 3 4 5 |
#行名でスライス df.loc['row2':'row3'] #行番号でスライス df.iloc[1:3] |
リストのスライスと同じ様にコロン(:)を使って書きます。
1 2 |
#負のインデックスは逆にスライス df.iloc[-3:-1] |
列を指定する方法
df[列名]
df.loc[:, 列名]
df.iloc[:, 列番号]
- at、iatは使えない
loc
やiloc
の引数は行→列の順になっています。
コロン(:)だけ書かれているのはすべての行を指定するという意味です。
例えば、col2を指定するときは3通りがあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#列名で取得 df['col2'] #列名で取得 df.loc[:, 'col2'] #列番号で取得 df.iloc[:, 1] #出力結果 row1 50 row2 60 row3 70 row4 80 Name: col2, dtype: int64 |
最終列を取得する方法
1 2 3 4 5 6 7 8 9 |
#最終列の取得 df.iloc[:, -1] #出力結果 row1 a row2 b row3 c row4 d Name: col3, dtype: object |
これも、行の場合と同じようにー1を渡すとOKです。
列をスライスする方法
df.loc[:, 列名:列名]
df.iloc[:, 列番号:列番号]
- at、iatは使えない
例えば、col1とcol2を取得する方法を考えましょう。
1 2 3 4 5 6 7 8 9 10 11 |
#列名で指定 df.loc[:, 'col1':'col2'] #列番号で指定 df.iloc[:, 0:2] #0は省略可能 df.iloc[:, :2] #-1も使える df.iloc[:, :-1] |
行と列をスライスする方法
引数には行のスライス→列のスライスの順で渡しましょう。
1 2 3 4 5 |
#行列名で指定 df.loc['row2':'row3', 'col1':'col2'] #行列番号で指定 df.iloc[1:3, 0:2] |
要素を指定する方法
行→列の順で渡すと要素のみ取得できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#行列名 df.loc['row3', 'col2'] #行列番号 df.iloc[2, 1] #行列名 df.at['row3', 'col2'] #行列番号 df.iat[2, 1] #出力結果 70 |
まとめ
いかがだったでしょうか。
今回はDataFrameの行・列・要素を指定する方法やスライスする方法をまとめてみました。
これらの方法は必ずと言っていいほど毎回使うものなので、
覚えておいた方が作業がスムーズに進みますね。
また、応用することで条件抽出などもできます。それに関しては別記事で解説します。