筛选包含特定值的多列

时间:2020-01-15 17:56:16

标签: python pandas filtering

我有一个这样的数据框:

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

还有其他方法吗?

3 个答案:

答案 0 :(得分:4)

我们可以将DataFrame.stackSeries.unstackDataFrame.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

对于多种情况,您可以使用AB

df[df.applymap(lambda x: x in ['A','B']).any(1)]

答案 2 :(得分:2)

您可以在apply中使用anyaxis=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