【问题标题】:search dataframe for a keyword in any column and get the rows在任何列中搜索关键字的数据框并获取行
【发布时间】:2016-03-25 02:09:57
【问题描述】:

我有一个数据框,我希望通过一一检查所有行的所有列中是否存在关键字来获得一个子集。 这是sn-p:

df.apply(lambda x: x.str.contains('TEST')).any()

但是因为不是所有的列值都是字符串类型,所以它会抛出错误:

AttributeError:('只能使用带有字符串值的.str访问器

感谢任何帮助。

【问题讨论】:

标签: python search pandas dataframe contains


【解决方案1】:

没有数据很复杂,但我尝试使用 numpy 函数numpy.column_stack 和列表理解:

print df
       A      B          D   E
0      A  TEST1 2014-04-08   8
1      B  TEST2 2014-05-08   7
2      B      C 2014-05-08  15
3      B  TEST3 2014-05-08   1
4  TESTA      A 2014-04-08   6
5      A  TEST5 2014-04-08   1

用带有字符串数据的列掩码子集

 mask = np.column_stack([df[col].str.contains("TEST") for col in ['A', 'B']])
 print mask
 [[False  True]
 [False  True]
 [False False]
 [False  True]
 [ True False]
 [False  True]]
print df.loc[mask.any(axis=1)]
       A      B          D  E
0      A  TEST1 2014-04-08  8
1      B  TEST2 2014-05-08  7
3      B  TEST3 2014-05-08  1
4  TESTA      A 2014-04-08  6
5      A  TEST5 2014-04-08  1

使用非字符串数据排除列的掩码子集

mask = np.column_stack([df[col].str.contains("TEST") for col in df if col not in ['D', 'E']])
print mask
[[False  True]
 [False  True]
 [False False]
 [False  True]
 [ True False]
 [False  True]]
print df.loc[mask.any(axis=1)]
       A      B          D  E
0      A  TEST1 2014-04-08  8
1      B  TEST2 2014-05-08  7
3      B  TEST3 2014-05-08  1
4  TESTA      A 2014-04-08  6
5      A  TEST5 2014-04-08  1

【讨论】:

    【解决方案2】:

    这里没有示例,但如何:

    df.apply(lambda row: row.astype(str).str.contains('TEST').any(), axis=1)

    所以,例如:

    import numpy as np
    import pandas as pd
    
    np.random.seed(0)
    df = pd.DataFrame(np.random.choice(['0.0', 'Hello', 'Goodbye'], (12, 3)))
    df.apply(lambda row: row.astype(str).str.contains('Hello').any(), axis=1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多