如果我想一次对多个列进行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]
Run Code Online (Sandbox Code Playgroud)
这有效 - 是否有更简洁的解决方案?
Zer*_*ero 15
你可以把两个isin条件都放进去&
df[df['A'].isin([1, 3]) & df['B'].isin([4, 7, 12])]
A B C
2 3 7 18
Run Code Online (Sandbox Code Playgroud)
你也可以使用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
Run Code Online (Sandbox Code Playgroud)
TBH,你目前的做法对我来说很好; 我无法看到isin或filter改进它的方法,因为我看不到如何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
Run Code Online (Sandbox Code Playgroud)
或者.loc如果我需要一个手柄.
您可以将这两个条件作为掩码并使用&:
In [12]:
df[(df['A'].isin([1,3])) & (df['B'].isin([4,7,12]))]
Out[12]:
A B C
2 3 7 18
Run Code Online (Sandbox Code Playgroud)
()由于运算符优先级,这里的条件需要括号
稍微更具可读性的是使用query:
In [15]:
df.query('A in [1,3] and B in [4,7,12]')
Out[15]:
A B C
2 3 7 18
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10889 次 |
| 最近记录: |