このページでは、Pandas で作成したデータフレームを操作して、特定の行・列を取得し、目的の形へ加工する手順について紹介します。
なお、特定の行、列を除外する方法については、「Pandas のデータフレームの特定の行・列を削除する」の記事をご参照ください。
特定の列を取得する
カラム名 (列名) を指定して、特定の列を抽出できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
>>> # "A" 列を抽出する >>> df['A'] 2013-01-01 -0.156236 2013-01-02 0.496579 2013-01-03 -0.220238 2013-01-04 0.168538 2013-01-05 0.731170 2013-01-06 1.332536 Freq: D, Name: A, dtype: float64 >>> # . (ドット) を利用しても同じ結果が得られます。 >>> df.A 2013-01-01 -0.156236 2013-01-02 0.496579 2013-01-03 -0.220238 2013-01-04 0.168538 2013-01-05 0.731170 2013-01-06 1.332536 Freq: D, Name: A, dtype: float64 |
特定の区間の行を抽出する
:
(コロン) で行番号を指定することで、特定の区間の行を抽出できます。行番は 0 行目から始まる点に注意しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>>> 1 行目から 3 行目を抽出 >>> df[1:3] A B C D 2013-01-02 0.496579 -0.286737 0.745850 0.468184 2013-01-03 -0.220238 -0.521626 0.405202 -1.185080 >>> 先頭から 3 行目までを抽出 >>> df[:3] A B C D 2013-01-01 -0.156236 -0.383022 -0.118212 0.938796 2013-01-02 0.496579 -0.286737 0.745850 0.468184 2013-01-03 -0.220238 -0.521626 0.405202 -1.185080 |
行名を指定して取り出すことも可能です。
1 2 3 4 5 6 |
>>> # "20130102" から "20130104" の行を抽出 >>> df['20130102':'20130104'] A B C D 2013-01-02 0.496579 -0.286737 0.745850 0.468184 2013-01-03 -0.220238 -0.521626 0.405202 -1.185080 2013-01-04 0.168538 1.550001 1.002619 0.518160 |
loc アトリビュートを使って特定の行・列を抽出する
loc
アトリビュートを利用して、ラベルに基づいて特定の行や抽出できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
>>> # 行名が "2013-01-01" の列を抽出 >>> df.loc["2013-01-01"] A -0.156236 B -0.383022 C -0.118212 D 0.938796 Name: 2013-01-01 00:00:00, dtype: float64 >>> # 列 "A", "B" の 2 列を抽出 >>> df.loc[:,['A','B']] A B 2013-01-01 -0.156236 -0.383022 2013-01-02 0.496579 -0.286737 2013-01-03 -0.220238 -0.521626 2013-01-04 0.168538 1.550001 2013-01-05 0.731170 0.064171 2013-01-06 1.332536 -1.359627 >>> # 行名 = "20130102" ~ "20130104" の "A" 列と "B" 列を取得 >>> df.loc['20130102':'20130104',['A','B']] A B 2013-01-02 0.496579 -0.286737 2013-01-03 -0.220238 -0.521626 2013-01-04 0.168538 1.550001 >>> # 行名 = "20130102" の "A" 列と "B" 列を取得 >>> df.loc['20130102',['A','B']] A 0.496579 B -0.286737 Name: 2013-01-02 00:00:00, dtype: float64 |
行や列の位置を指定して行・列を取得する
iloc
アトリビュートを用いて、行や列の位置に基づいて行・列を取得することができます。行や列は 0 行目・0列目から始まる点に注意しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
>>> # 3 行目を取得 >>> df.iloc[3] A 0.168538 B 1.550001 C 1.002619 D 0.518160 Name: 2013-01-04 00:00:00, dtype: float64 >>> # 1,2,4 行目と 0-2 列目を取得 >>> df.iloc[[1,2,4],[0,2]] A C 2013-01-02 0.496579 0.745850 2013-01-03 -0.220238 0.405202 2013-01-05 0.731170 -0.239234 >>> # 1-3 行目と全ての列を取得 >>> df.iloc[1:3,:] A B C D 2013-01-02 0.496579 -0.286737 0.745850 0.468184 2013-01-03 -0.220238 -0.521626 0.405202 -1.185080 >>> # 全ての行と 1-3 列目を取得 >>> df.iloc[:,1:3] B C 2013-01-01 -0.383022 -0.118212 2013-01-02 -0.286737 0.745850 2013-01-03 -0.521626 0.405202 2013-01-04 1.550001 1.002619 2013-01-05 0.064171 -0.239234 2013-01-06 -1.359627 -0.630888 >>> # 1 行目の 1 列目の値を取得 >>> df.iloc[1,1] -0.28673700820377424 |
条件を指定して行・列を取得する
True
または False
を返す式を指定することで、特定の条件式に基づく行・列の取得ができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
>>> # "A" 列の値が 0 より大きい行を取得 >>> df[df.A > 0] A B C D 2013-01-02 0.496579 -0.286737 0.745850 0.468184 2013-01-04 0.168538 1.550001 1.002619 0.518160 2013-01-05 0.731170 0.064171 -0.239234 0.298792 2013-01-06 1.332536 -1.359627 -0.630888 -1.211916 >>> # 値が 0 より大きい値のみを取得 >>> df[df > 0] A B C D 2013-01-01 NaN NaN NaN 0.938796 2013-01-02 0.496579 NaN 0.745850 0.468184 2013-01-03 NaN NaN 0.405202 NaN 2013-01-04 0.168538 1.550001 1.002619 0.518160 2013-01-05 0.731170 0.064171 NaN 0.298792 2013-01-06 1.332536 NaN NaN NaN |
isin()
メソッドと組み合わせて使うことで、複数の特定の値を含む行・列の抽出ができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
>>> # データフレーム df2 を作成 >>> df2 = df.copy() >>> df2['E'] = ['one', 'one', 'two', 'three', 'four', 'three'] >>> df2 A B C D E 2013-01-01 -0.156236 -0.383022 -0.118212 0.938796 one 2013-01-02 0.496579 -0.286737 0.745850 0.468184 one 2013-01-03 -0.220238 -0.521626 0.405202 -1.185080 two 2013-01-04 0.168538 1.550001 1.002619 0.518160 three 2013-01-05 0.731170 0.064171 -0.239234 0.298792 four 2013-01-06 1.332536 -1.359627 -0.630888 -1.211916 three >>> # "E" 列に "two" または "four" を値に持つ行を抽出 >>> df2[df2['E'].isin(['two','four'])] A B C D E 2013-01-03 -0.220238 -0.521626 0.405202 -1.185080 two 2013-01-05 0.731170 0.064171 -0.239234 0.298792 four |
参考: 10 Minutes to pandas — pandas 0.18.0 documentation