合并两个具有列表的数据集并在合并后使用 pandas 保留列表
Posted
技术标签:
【中文标题】合并两个具有列表的数据集并在合并后使用 pandas 保留列表【英文标题】:Merge two datasets that have lists and keep the list after merge using pandas 【发布时间】:2020-10-20 19:14:49 【问题描述】:我有这两个很难合并的数据框:
df1 = pd.DataFrame('id': [ ["001", "001"], ["001"], ["007", "001"]])
输出:
id
0 [001, 001]
1 [001]
2 [007, 001]
和
df2 = pd.DataFrame('id': [ "001", "007"],'name': ['Name01', 'Name02'])
输出:
id name
0 001 Name01
1 007 Name02
而我想到达的是这样的:
df3 = pd.DataFrame('id': [ ["001", "001"], ["001"], ["007", "01"]],
'name': [ ['Name01','Name01'], ['Name01'], ['Name02', 'Name01']])
输出:
id name
0 [001, 001] [Name01, Name01]
1 [001] [Name01]
2 [007, 01] [Name02, Name01]
我的问题是我可以合并,但我没有设法放入我想要的格式。我现在拥有的就在这里:
pd.DataFrame(df2.merge(df1.explode('id'), on= 'id')).groupby('id').agg(lambda x: x.tolist())
输出:
id name
001 [Name01, Name01, Name01, Name01]
007 [Name02]
【问题讨论】:
【参考方案1】:在列表理解中使用df2
创建的字典mapping
,应该更快像explode
和聚合list
,真实数据中的最佳测试:
d = df2.set_index('id')['name'].to_dict()
df1['name'] = [[d[y] for y in x if y in d] for x in df1['id']]
print (df1)
id name
0 [001, 001] [Name01, Name01]
1 [001] [Name01]
2 [007, 001] [Name02, Name01]
【讨论】:
我想这应该比使用explode
和map
更快吧?
@ShubhamSharma - 我认为merge
/ map
这里很快,但botlenck 主要是.agg(list)
,也很慢.explode('id')
。所以在我看来,最后的表现并不是那么好
这就是我的想法,因此我删除了答案,但我一定会测试这两种方法的性能,顺便说一句,答案很好。【参考方案2】:
我们可以explode
+ merge
df1=df1.explode('id').reset_index().merge(df2,how='left').groupby('index').agg(list)
id name
index
0 [001, 001] [Name01, Name01]
1 [001] [Name01]
2 [007, 001] [Name02, Name01]
或者只是 map
并分配
df1['name']=df1.id.explode().map(df2.set_index('id').name).groupby(level=0).agg(list)
0 [Name01, Name01]
1 [Name01]
2 [Name02, Name01]
Name: id, dtype: object
【讨论】:
以上是关于合并两个具有列表的数据集并在合并后使用 pandas 保留列表的主要内容,如果未能解决你的问题,请参考以下文章