【问题标题】:Retrieve match from list of strings and add as column in dataframe从字符串列表中检索匹配项并添加为数据框中的列
【发布时间】:2021-10-27 13:30:00
【问题描述】:

我有一个数据框,其中包含 textuser 列。

user text
Tom I love bananas
Dick I love apples
Harry I love apples and bananas

我想查找包含fruits 列表的text 行。为了 每个匹配的字符串都会在新列fruitsfruits_with_colors 中添加一个新行。预期输出如下:

user text fruits
Tom I love bananas bananas
Dick I love apples apples
Harry I love apples and bananas apples
Harry I love apples and bananas bananas

我在考虑如何执行此操作时遇到了一些麻烦。我正在使用熊猫做以下事情:

fruits = ['apples', 'bananas']

df_with_matches = df[df['text'].str.contains('|'.join(fruits))]

但我返回错误sequence item 0: expected str instance, list found

【问题讨论】:

  • 第二张表是预期的输出吗?
  • 谢谢,我已经编辑了问题以反映这一点。

标签: pandas list dataframe


【解决方案1】:

您可以使用str.findall将水果提取到一个列表中,然后explode它:

df.assign(fruits = df.text.str.findall('|'.join(fruits))).explode('fruits')

    user                        text   fruits
0    Tom              I love bananas  bananas
1   Dick               I love apples   apples
2  Harry   I love apples and bananas   apples
2  Harry   I love apples and bananas  bananas

【讨论】:

  • 谢谢! +1 这看起来是一个很好的解决方案;对我来说它返回错误sequence item 0: expected str instance, list found
  • 这是因为您的fruits 列表有一个内部列表,而join 会抛出错误。
  • 关于此解决方案的进一步问题。它还将匹配列表中的部分字符串,而不是完整的单词,例如ba。我需要在列表中指定r'\bbananas\b',还是有办法在搜索中包含正则表达式?
  • 如果需要全匹配,可以使用'\\b' + '\\b|\\b'.join(fruits) + '\\b'创建模式
猜你喜欢
  • 2021-01-15
  • 1970-01-01
  • 2022-12-15
  • 2023-01-20
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
相关资源
最近更新 更多