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合并到列中?