首页 > 解决方案 > Pandas 基于非唯一列匹配创建一个新列,连接字符串

问题描述

我有一个数据框,其中一个 objectid 映射到一个 collisionid(不是唯一的)

df1

    objectid    collisionid  
0   3000        0002  
1   4000        0001  
2   5000        0002

我有另一个包含所有可能的碰撞 id 的数据框:

df2

    collisionid   
0   0001           
1   0002   
2   0003           

我想更新 df2 以包含映射到该碰撞的所有对象 id 的一行:

df2 - 想要的

    collisionid    objectids  
0   0001           4000  
1   0002           3000,5000  
2   0003           

(在这种情况下,objectids 存储为字符串)。

我试图做这样的事情:

df2['objectids'] = df2['collisionid'].map(df1.set_index('collisionid')['objectid'])

但我得到一个错误Reindexing only valid with uniquely valued Index objects。我该如何去做这件事并尝试合并字符串?

标签: pythonpython-3.xpandas

解决方案


首先合并它们,然后分组和聚合:

(df2.merge(df1, how='left', on='collisionid')
    .fillna('')
    .groupby('collisionid', as_index=False)
    .agg(','.join))

  collisionid   objectid
0        0001       4000
1        0002  3000,5000
2        0003           

对于特定列,您的agg语法会发生一些变化:

(df2.merge(df1, how='left', on='collisionid')
    .fillna('')
    .groupby('collisionid')
    .agg(objectid=('objectid', ','.join)) # agg(output_name=(input_name, aggfunc))
    .reset_index())

  collisionid   objectid
0        0001       4000
1        0002  3000,5000
2        0003           

推荐阅读