Python Dataframe:DF列中的字符串包含来自不同DF的子字符串和匹配时返回的子字符串值

Posted

技术标签:

【中文标题】Python Dataframe:DF列中的字符串包含来自不同DF的子字符串和匹配时返回的子字符串值【英文标题】:Python Dataframe: String in DF Column Contains Substring from Different DF and Substring Values Returned When Match 【发布时间】:2021-11-15 01:40:49 【问题描述】:

同事们,

也许你可以帮助我完成看似简单的任务,但我还没有足够的经验来解决这个问题。

假设我们有两个数据框:

    df1 包含子字符串; df2 包含较长的文本块,其中一些包含来自 df1 的子字符串。
df1 = 'subst': ['LONDON BRIDGE', 'TRUE GRIT', 'FIVE TIMES FIVE', 'THREE TIME DEAD', 'TRUE IS NOT', 'OH NO', 'LEBRON JAMES']

df2 = 'strng': ['LEBRON JAMES SCORED 20', 'THREE TIMES DEAD JOHNY WAS HELL OF THE COOK', 'TRUE IS NOT WHAT YOU THINK', 'FIVE TIMES FIVE IS NOT WHAT LEBRON SCORED']

df1 = pd.DataFrame(df1)
df2 = pd.DataFrame(df2)

这是我需要的:

    我需要遍历行以检查 df1['subst'] 中的子字符串是否存在于 df2['strng'] 中的任何位置 如果它存在于 df2 中,我希望 df2 中的新列 ['match_df1'] 包含来自 df1 的子字符串值。

df2 中的最终输出看起来像这样

strng match_df1
LEBRON JAMES SCORED 20 LEBRON JAMES
THREE TIMES DEAD JOHNY WAS HELL OF THE COOK THREE TIMES DEAD
TRUE IS NOT WHAT YOU THINK TRUE IS NOT
FIVE TIMES FIVE IS NOT WHAT LEBRON SCORED FIVE TIMES FIVE

【问题讨论】:

这能回答你的问题吗? Searching substring of a dataframe if it exists in another dataframe column 【参考方案1】:

正如@Chris 所注意到的,这个answer 可能会完成这项工作。 然后像这样过滤空字符串:

>>> for ind1 in df1.index:
...    df1.loc[ind1, 'strng'] = ', '.join(list(df2[df2['strng'].str.contains(df1['subst'][ind1])]['strng']))
>>> df1[df1['strng'].str.len() > 0]
    subst                strng
2   FIVE TIMES FIVE      FIVE TIMES FIVE IS NOT WHAT LEBRON SCORED
4   TRUE IS NOT          TRUE IS NOT WHAT YOU THINK
6   LEBRON JAMES         LEBRON JAMES SCORED 20

所有代码:

import pandas as pd

df1 = 'subst': ['LONDON BRIDGE', 'TRUE GRIT', 'FIVE TIMES FIVE', 'THREE TIME DEAD', 'TRUE IS NOT', 'OH NO', 'LEBRON JAMES']
df2 = 'strng': ['LEBRON JAMES SCORED 20', 'THREE TIMES DEAD JOHNY WAS HELL OF THE COOK', 'TRUE IS NOT WHAT YOU THINK', 'FIVE TIMES FIVE IS NOT WHAT LEBRON SCORED']

df1 = pd.DataFrame(df1)
df2 = pd.DataFrame(df2)

for ind1 in df1.index:
   df1.loc[ind1, 'strng'] = ', '.join(list(df2[df2['strng'].str.contains(df1['subst'][ind1])]['strng']))
df1[df1['strng'].str.len() > 0]

【讨论】:

非常感谢!尽管在尝试对我的数据(以及示例)执行此操作时,我收到“'list' object is not callable”错误。 嗨@Raganosis,我只是重新运行你的4行代码,然后是我的,我得到了相同的结果,没有任何错误。我在答案末尾添加了我刚刚运行的确切代码,您可以复制并在您这边尝试一下,看看您是否仍然有错误? 嗨@tlentali,再次感谢。有趣的是,仅在我重新启动 python 时才有效。无论如何,非常感谢,它解决了这个问题! 嗨@Raganosis,很高兴帮助你:)!如果此答案或任何答案解决了您的问题,请单击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。祝你有美好的一天!

以上是关于Python Dataframe:DF列中的字符串包含来自不同DF的子字符串和匹配时返回的子字符串值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Python Pandas Dataframe 中的 STRING 列中提取嵌套字典?

根据上一列中的值在 Python Dataframe 中构建行

如何将Python Dask Dataframes合并到列中?

使用 lambda 以字符串开头时替换 DataFrame 列中的值

将最长字段放在dataframe列中

DataFrame 替换列中的多个键