我有一个这样的数据框:
col1 col2 col3 col4
A W Z C
F W P F
E P Y C
B C B C
M A V C
D O X A
Y L Y D
Q V R A
我想过滤多个列是否具有特定值。例如,我要过滤包含A
的行。结果应该是:
col1 col2 col3 col4
A W Z C
M A V C
D O X A
Q V R A
由于它只是大型数据集的一小部分,所以我不能使用
df[(df['col1'].str.contains('A')) | (df['col2'].str.contains('A')) | (df['col3'].str.contains('A')) |
(df['col4'].str.contains('A'))]
还有其他方法吗?
答案 0 :(得分:4)
我们可以将DataFrame.stack
和Series.unstack
与DataFrame.any
一起使用
df[df.stack(dropna=False).str.contains('A').unstack().any(axis=1)]
或@Alollz建议的更好的解决方案
df[df.stack().str.contains('A').any(level=0)]
输出
col1 col2 col3 col4
0 A W Z C
4 M A V C
5 D O X A
7 Q V R A
更新
要检查几个字符,请使用join
df[df.stack().str.contains('|'.join(['A','B'])).any(level=0)]
col1 col2 col3 col4
0 A W Z C
3 B C B C
4 M A V C
5 D O X A
7 Q V R A
答案 1 :(得分:3)
这是您可以采取的方法:
df[df.applymap(lambda x: x == 'A').any(1)]
col1 col2 col3 col4
0 A W Z C
4 M A V C
5 D O X A
7 Q V R A
对于多种情况,您可以使用A
,B
:
df[df.applymap(lambda x: x in ['A','B']).any(1)]
答案 2 :(得分:2)
您可以在apply
中使用any
和axis=1
:
df[df.apply(lambda x: x.str.contains('A')).any(1)]
col1 col2 col3 col4
0 A W Z C
4 M A V C
5 D O X A
7 Q V R A
或者:
s=df.stack()
s[s.str.contains('A').groupby(level=0).transform('any')].unstack()
col1 col2 col3 col4
0 A W Z C
4 M A V C
5 D O X A
7 Q V R A