在pandas中为for循环创建一个布尔索引

时间:2014-03-07 15:04:53

标签: python pandas dataframe

我想获得一个带有布尔索引的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以确保它在数据帧变空时有效),但这似乎不是非常有效。 有没有人知道如何用干净的熊猫配方写出来?

1 个答案:

答案 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也可以这样做。