问题描述
我使用了两个不同的数据框:
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()
检索每组的最大值。