LoginSignup
67
73

More than 3 years have passed since last update.

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

Last updated at Posted at 2014-03-17

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
67
73
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
67
73