2015-04-20 62 views
2

如果我想要做的ISIN上多列测试一次索引,我可以这样做:熊猫使用多个ISIN条款

>>> 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] 

这工作 - 有一个更简洁的解决方案吗?

回答

5

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

你可以将两个条件中的一个面具,使用&

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 
8

您可以将isin条件都放入&

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

你也可以使用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