このページでは、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