使用多个isin子句进行pandas索引

时间:2015-04-20 20:16:36

标签: python pandas

如果我想一次对多个列进行is-in测试,我可以这样做:

>>> from pandas import DataFrame
>>> df = DataFrame({'A': [1, 2, 3], 'B': [1, 4, 7], 'C' : [10, 12, 18]})   
>>> mask = df[['A','B']].isin({'A': [1, 3], 'B': [4, 7, 12]}).all(axis=1)
>>> df = df[mask]

有效 - 是否有更简洁的解决方案?

3 个答案:

答案 0 :(得分:13)

您可以将isin条件放在&

df[df['A'].isin([1, 3]) & df['B'].isin([4, 7, 12])]
   A  B   C
2  3  7  18

你也可以使用像{/ p>这样的query功能

c_a = [1, 3]
c_b = [4, 7, 12]
df.query('(B in @c_b) & (A in @c_a)')

   A  B   C
2  3  7  18

答案 1 :(得分:8)

TBH,您目前的做法对我来说很好;我无法通过isinfilter来改进它,因为我无法看到如何让isin仅使用字典中的列或filter表现为all

我不喜欢硬编码列名,所以我可能会把它写成

>>> keep = {'A': [1, 3], 'B': [4, 7, 12]}
>>> df[df[list(keep)].isin(keep).all(axis=1)]
   A  B   C
2  3  7  18

.loc,如果我需要一个句柄。

答案 2 :(得分:3)

您可以将这两个条件作为掩码并使用&

In [12]:

df[(df['A'].isin([1,3])) & (df['B'].isin([4,7,12]))]
Out[12]:
   A  B   C
2  3  7  18

由于运算符优先级

,这些条件需要围绕它们的括号()

稍微更具可读性的是使用query

In [15]:

df.query('A in [1,3] and B in [4,7,12]')
Out[15]:
   A  B   C
2  3  7  18