合并两个具有列表的数据集并在合并后使用 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]

【讨论】:

我想这应该比使用explodemap 更快吧? @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 保留列表的主要内容,如果未能解决你的问题,请参考以下文章

合并最近的追溯时间戳并在 pandas 中填充

Pandas 合并具有不同列的两个数据框

Pandas:合并具有不同索引和缺失值的两个数据框

Pandas 将具有多个值的行数据合并到列的 Python 列表中

合并具有时间容差的 pandas 时间序列

将具有相同列/索引的两个 pandas DataFrame 合并为一个 DataFrame