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