【问题标题】:Merge two datasets that have lists and keep the list after merge using pandas合并两个具有列表的数据集并在合并后使用 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]

【问题讨论】:

    标签: python pandas list merge


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 2022-11-11
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多