Pandas でデータフレームから特定の行・列を取得する

このページでは、Pandas で作成したデータフレームを操作して、特定の行・列を取得し、目的の形へ加工する手順について紹介します。

なお、特定の行、列を除外する方法については、「Pandas のデータフレームの特定の行・列を削除する」の記事をご参照ください。

特定の列を取得する

カラム名 (列名) を指定して、特定の列を抽出できます。

>>> # "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 行目から 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

行名を指定して取り出すことも可能です。

>>> # "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 アトリビュートを利用して、ラベルに基づいて特定の行や抽出できます。

>>> # 行名が "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列目から始まる点に注意しましょう。

>>> # 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 を返す式を指定することで、特定の条件式に基づく行・列の取得ができます。

>>> # "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() メソッドと組み合わせて使うことで、複数の特定の値を含む行・列の抽出ができます。

>>> # データフレーム 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