2927

DataFrameパンダのいくつかの列の値に基づいて行を選択するにはどうすればよいですか?

SQL では、次を使用します。

SELECT *
FROM table
WHERE column_name = some_value

Pandas のドキュメントを見てみましたが、すぐには答えが見つかりませんでした。

4

13 に答える 13

5524

列の値がスカラー に等しい行を選択するには、次some_valueを使用します==

df.loc[df['column_name'] == some_value]

列の値が iterable にある行を選択するには、次some_valuesを使用しますisin

df.loc[df['column_name'].isin(some_values)]

複数の条件を で組み合わせる&:

df.loc[(df['column_name'] >= A) & (df['column_name'] <= B)]

括弧に注意してください。Python の演算子の優先順位規則により、はおよび&よりも強くバインドされます。したがって、最後の例の括弧が必要です。括弧なし<=>=

df['column_name'] >= A & df['column_name'] <= B

として解析されます

df['column_name'] >= (A & df['column_name']) <= B

SeriesのTruth 値はあいまいなエラーになります


列の値が等しくない some_value行を選択するには、次を使用します!=

df.loc[df['column_name'] != some_value]

isinブール値の Series を返すため、値が にない行を選択するにはsome_values、 を使用してブール値の Series を否定し~ます。

df.loc[~df['column_name'].isin(some_values)]

例えば、

import pandas as pd
import numpy as np
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
                   'B': 'one one two three two two one three'.split(),
                   'C': np.arange(8), 'D': np.arange(8) * 2})
print(df)
#      A      B  C   D
# 0  foo    one  0   0
# 1  bar    one  1   2
# 2  foo    two  2   4
# 3  bar  three  3   6
# 4  foo    two  4   8
# 5  bar    two  5  10
# 6  foo    one  6  12
# 7  foo  three  7  14

print(df.loc[df['A'] == 'foo'])

収量

     A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14

含めたい値が複数ある場合は、それらをリスト(またはより一般的には反復可能なもの)に入れて、次を使用しますisin

print(df.loc[df['B'].isin(['one','three'])])

収量

     A      B  C   D
0  foo    one  0   0
1  bar    one  1   2
3  bar  three  3   6
6  foo    one  6  12
7  foo  three  7  14

ただし、これを何度も行いたい場合は、最初にインデックスを作成してから使用する方が効率的であることに注意してくださいdf.loc

df = df.set_index(['B'])
print(df.loc['one'])

収量

       A  C   D
B              
one  foo  0   0
one  bar  1   2
one  foo  6  12

または、インデックスの使用から複数の値を含めるにはdf.index.isin:

df.loc[df.index.isin(['one','two'])]

収量

       A  C   D
B              
one  foo  0   0
one  bar  1   2
two  foo  2   4
two  foo  4   8
two  bar  5  10
one  foo  6  12
于 2013-06-12T17:44:20.483 に答える
327

tl;dr

に相当するパンダ

select * from table where column_name = some_value

table[table.column_name == some_value]

複数の条件:

table[(table.column_name == some_value) | (table.column_name2 == some_value2)]

また

table.query('column_name == some_value | column_name2 == some_value2')

コード例

import pandas as pd

# Create data set
d = {'foo':[100, 111, 222],
     'bar':[333, 444, 555]}
df = pd.DataFrame(d)

# Full dataframe:
df

# Shows:
#    bar   foo
# 0  333   100
# 1  444   111
# 2  555   222

# Output only the row(s) in df where foo is 222:
df[df.foo == 222]

# Shows:
#    bar  foo
# 2  555  222

上記のコードでは、この場合df[df.foo == 222]、列の値に基づいて行を提供するのは行です。222

複数の条件も可能です。

df[(df.foo == 222) | (df.bar == 444)]
#    bar  foo
# 1  444  111
# 2  555  222

ただし、その時点では、冗長性が低く、同じ結果が得られるため、クエリ関数を使用することをお勧めします。

df.query('foo == 222 | bar == 444')
于 2015-07-08T15:17:38.740 に答える
81

以前の回答の構文は冗長で覚えにくいと思います。Pandasquery()は v0.13 でこのメソッドを導入しましたが、私はそれをとても気に入っています。あなたの質問のために、あなたはできるdf.query('col == val')

http://pandas.pydata.org/pandas-docs/version/0.17.0/indexing.html#indexing-queryから複製

In [167]: n = 10

In [168]: df = pd.DataFrame(np.random.rand(n, 3), columns=list('abc'))

In [169]: df
Out[169]: 
          a         b         c
0  0.687704  0.582314  0.281645
1  0.250846  0.610021  0.420121
2  0.624328  0.401816  0.932146
3  0.011763  0.022921  0.244186
4  0.590198  0.325680  0.890392
5  0.598892  0.296424  0.007312
6  0.634625  0.803069  0.123872
7  0.924168  0.325076  0.303746
8  0.116822  0.364564  0.454607
9  0.986142  0.751953  0.561512

# pure python
In [170]: df[(df.a < df.b) & (df.b < df.c)]
Out[170]: 
          a         b         c
3  0.011763  0.022921  0.244186
8  0.116822  0.364564  0.454607

# query
In [171]: df.query('(a < b) & (b < c)')
Out[171]: 
          a         b         c
3  0.011763  0.022921  0.244186
8  0.116822  0.364564  0.454607

を前に付けることで、環境内の変数にアクセスすることもできます@

exclude = ('red', 'orange')
df.query('color not in @exclude')
于 2016-02-09T01:36:49.217 に答える
29

ここに簡単な例があります

from pandas import DataFrame

# Create data set
d = {'Revenue':[100,111,222], 
     'Cost':[333,444,555]}
df = DataFrame(d)


# mask = Return True when the value in column "Revenue" is equal to 111
mask = df['Revenue'] == 111

print mask

# Result:
# 0    False
# 1     True
# 2    False
# Name: Revenue, dtype: bool


# Select * FROM df WHERE Revenue = 111
df[mask]

# Result:
#    Cost    Revenue
# 1  444     111
于 2013-06-13T11:49:00.543 に答える