Pandasでデータフレームを条件指定で参照する

  • 59
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Rっぽく条件指定する時に悩んだのでメモ。
ixが今のところ良さそう。

とりあえず、データフレームを作る

>>> df = pd.DataFrame(arange(12).reshape((3, 4)), index=list("ABC"), columns=list("abcd"))
>>> df
   a  b   c   d
A  0  1   2   3
B  4  5   6   7
C  8  9  10  11

スライスで参照する

ixの第1引数に行を指定するスライス。第2引数に列を指定するスライス。
引数の省略は無理みたい。

>>> #行のみ指定
>>> df.ix[ 1: , :]
   a  b   c   d
B  4  5   6   7
C  8  9  10  11
>>>
>>> #列のみ指定
>>> df.ix[ : , 1:3]
   b   c
A  1   2
B  5   6
C  9  10
>>>
>>> #行・列の両方をスライスで指定
>>> df.ix[ 1: , 1:3]
   b   c
B  5   6
C  9  10

インデックス(行番号、列番号)で参照する

抽出するIndex番号をリストで渡してやればいい。インデックスは、名称でもOK。なお、スライスと併用可能な模様。
リストで指定すれば、順番を入れ替えることも可能。

>>> #0行目と2行目、1列目と2列目と3列目を参照する
>>> df.ix[ [0,2], [1,2,3]]
   b   c   d
A  1   2   3
C  9  10  11
>>>
>>> #スライスと併用可
>>> df.ix[[0,2], :]
   a  b   c   d
A  0  1   2   3
C  8  9  10  11
>>> 
>>> #名称で指定
>>> df.ix["B", "b"]
5
>>>
>>> #範囲指定
>>> df.ix["B":"C", "b":"c"]
   b   c
B  5   6
C  9  10
>>>
>>> #名称をリストで指定
>>> df.ix[["A","C"], ["b","a"]]
   b  a
A  1  0
C  9  8

条件式で参照する

ixの行指定か列指定で、条件式を突っ込んでやればいい。
スライスも併用できるので、特定の行全部とか、特定の列全部の場合はスライスで:だけ入れる。

>>> #行の合計が10以上の行だけ抽出
>>> df.ix[df.apply(sum, axis=1) >= 10, :]
   a  b   c   d
B  4  5   6   7
C  8  9  10  11
>>>
>>> #列の最大値が10以上の列だけ抽出
>>> df.ix[ : , df.apply(max, axis=0) >= 10]
    c   d
A   2   3
B   6   7
C  10  11
>>>
>>> #Ture/Falseでも指定できる
>>> df.ix[ [True,False,True] , [False,False,True,True] ]
    c   d
A   2   3
C  10  11