微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何比较数据框中的两个列表列表?

如何解决如何比较数据框中的两个列表列表?

我使用了两个不同的数据框:

      Project,Paragraph,Articles
df1 = 18PR001,001,[A,B,C,D,E,F]
      18PR002,C]
      18PR002,002,F]
      ...,...,...
 
      Recipe,Articles
df2 = 9801,C]
      9802,C]
      9803,E]
      ...,...

我希望将在 df1 中有类似文章的食谱作为新列表附加到新的 df 中,如下所示:

      Project,Recipe
df3 = 18PR001,[9801,9802,9803]
      18PR002,[9802]
      18PR002,[9803]
      ...,...

我通过比较两个列表找到了一些答案,但数据框中的其他信息也很重要。你会建议我做什么?提前致谢!

解决方法

您可以通过分解它们的文章列表然后将它们合并到第三个数据集来匹配 DataFrames 上的记录,如下代码:

import pandas as pd

df1 = pd.DataFrame({'Project': ['18PR001','18PR002','18PR002'],'Paragraph': ['001','001','002'],'Articles': [['A','B','C','D','E','F'],['A','C'],'F']]})

df2 = pd.DataFrame({'Recipe': [9801,9802,9803],'E']]})


df3 = pd.merge(df2.explode('Articles'),df1.explode('Articles'),on='Articles')

要获得任何匹配项,您只需 groupby() 并对其应用 list()

df3.groupby(['Project','Paragraph'])['Recipe'].apply(list)

或检索唯一匹配项:

df3.groupby(['Project','Paragraph'])['Recipe'].unique().apply(list)

此代码的问题在于它会检索常见文章中的任何匹配项,正如 SeaBean 之前友好评论的那样。

另一种方法是计算匹配的数量并标准化结果

df3.groupby(['Project','Paragraph'])['Recipe'].apply(lambda x: x.value_counts(normalize=True))

最后一段代码的输出是:

Project  Paragraph      
18PR001  001        9803    0.375
                    9801    0.375
                    9802    0.250
18PR002  001        9802    0.400
                    9801    0.400
                    9803    0.200
         002        9803    0.600
                    9802    0.200
                    9801    0.200

然后您可以设置一个阈值来考虑两个相似的项目(即 60%)并过滤数据,您可以使用 max() 或什至 nlargest() 检索每组的最大值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。