【问题标题】:How would I select rows in pandas that match a list of strings, not just one particular string?如何在 pandas 中选择与字符串列表匹配的行,而不仅仅是一个特定的字符串?
【发布时间】:2019-07-29 15:58:19
【问题描述】:

假设我们有一个数据框 df 和一个标记为“A”的列。对于选择匹配 ONE string -'some_string' 的行,df['A'].str.contains('some_string') 效果很好。

我的问题是,是否有相应的方法可以传递给包含字符串列表,以便获得部分匹配?而不是 'some_string' 我可以给它一个字符串列表吗?我试图避免使用 for 循环并将数据帧切片并连接到新的数据帧中。

假设数据框是

pd.DataFrame(np.array([['cat', 2], ['rat', 5], ['ball', 8],['string', 8]]),columns=['A', 'B']))

list =['at','ll','ac']

所以我想选择带有 cat、rat、ball 的行。对不起,人为设计的例子。

【问题讨论】:

标签: python pandas


【解决方案1】:

如果A 总是包含您想要在列表中找到的字符串,您可以这样做:

df['A'].map(lambda x: 1 if x in list_of_strings else 0) 

对于每一行,lambda 函数将检查'A' 中的值(临时存储在x 中的值是否作为list_of_strings 中的元素之一存在,并相应地返回10

然后您可以在此新映射列为 1 时进行过滤

【讨论】:

  • 这适用于子字符串匹配吗?而不是 if x in list_of_strings 我可以说包含吗?
  • 是的,但它可能效率不高。您可以使用列表理解:lambda x: True in [x in s for s in list_of_strings]
  • @Tacratis 你应该使用any(...) 而不是True in [...]
【解决方案2】:

pandas.Series.str.contains 接受字符串或正则表达式。所以你可以从字符串列表中构建一个正则表达式:

import pandas as pd

strings = "fo", "ba"
x = pd.Series(["foo", "bar", "baz", "buzz"])
x.str.contains("|".join(strings))
# 0     True
# 1     True
# 2     True
 #3    False
# dtype: bool

如果要匹配的字符串列表很长,并且您可能需要 na=False 来忽略 NaN 值,这可能会很慢,如 mentioned in the comments by @anky_91

【讨论】:

  • 还添加`na=False 以防万一。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 2020-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多