Edited at

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

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
>>>
>>> #True/Falseでも指定できる
>>> df.ix[ [True,False,True] , [False,False,True,True] ]
c d
A 2 3
C 10 11