【问题标题】:Filtering Multiple Columns Containing a Certain Value过滤包含某个值的多个列
【发布时间】:2020-05-02 13:20:28
【问题描述】:

我有一个这样的数据框:

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

还有其他方法吗?

【问题讨论】:

    标签: python pandas filtering


    【解决方案1】:

    我们可以使用DataFrame.stack + Series.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
    

    【讨论】:

    • 你甚至不需要unstackany 可以在 Index 级别上运行,因此:df.stack().str.contains('A').any(level=0) 为您提供面具。
    • @ALollz 非常好,我应该探索更多:) 我认为只有聚合函数有级别作为参数,但没有考虑任何
    • 是的,anysum 和其他一些人支持 level 参数。我不认为df.sum(level=0)df.groupby(level=0).sum() 相比有任何真正的好处,除了它不那么冗长。
    • 你是对的:) 我总是忘记我能做到这一点@ALollz
    【解决方案2】:

    你可以这样做:

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

    【讨论】:

    • 感谢@YOLO 的回答。能解释一下any(1)的作用是什么吗?
    • any(1) 逐行检查是否存在“A”,如果存在,则返回TRUE
    • 谢谢,这看起来不错。只是一个小问题:如果这是一个像['A','B'] 这样的列表,而不仅仅是A,我该如何制作过滤器?因为我无法为字符串创建isin 语句。
    【解决方案3】:

    您可以使用applyany 以及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
    

    【讨论】:

      猜你喜欢
      • 2019-10-30
      • 1970-01-01
      • 2019-06-24
      • 2020-11-29
      • 1970-01-01
      • 2015-01-06
      • 2020-06-22
      • 2021-11-18
      • 2022-12-02
      相关资源
      最近更新 更多