我想获得一个带有布尔索引的pandas数据帧的子集。
我要测试的条件是(df [var_0] == value_0)& ......& (df [var_n] == value_n)其中涉及的变量数n可以改变。结果我无法写:
df = df[(df[var_0] == value_0) & ... & (df[var_n] == value_n)]
我可以这样做:
for k in range(0,n+1) :
df = df[df[var_k] == value_k]
(有一些尝试catch以确保它在数据帧变空时有效),但这似乎不是非常有效。 有没有人知道如何用干净的熊猫配方写出来?
答案 0 :(得分:3)
isin
方法应该适合你。
In [7]: df
Out[7]:
a b c d e
0 6 3 1 9 6
1 8 9 5 7 2
2 6 4 7 4 3
3 4 8 0 0 5
4 4 4 2 3 4
5 2 5 9 0 9
6 4 8 2 9 1
7 3 0 8 9 7
8 0 5 9 9 6
9 0 7 8 4 8
[10 rows x 5 columns]
In [8]: vals = {'a': [3], 'b': [0], 'c': [8], 'd': [9], 'e': [7]}
In [9]: df.isin(vals)
Out[9]:
a b c d e
0 False False False True False
1 False False False False False
2 False False False False False
3 False False False False False
4 False False False False False
5 False False False False False
6 False False False True False
7 True True True True True
8 False False False True False
9 False False True False False
[10 rows x 5 columns]
In [10]: df[df.isin(vals).all(1)]
Out[10]:
a b c d e
7 3 0 8 9 7
[1 rows x 5 columns]
vals
dict中的值必须是一个集合,因此我将它们放入长度为1的列表中。可能query
也可以这样做。