Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
74
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
74
Help us understand the problem. What are the problem?