Python 熊猫基于非唯一列匹配创建新列,并连接字符串

Python 熊猫基于非唯一列匹配创建新列,并连接字符串,python,python-3.x,pandas,Python,Python 3.x,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

我有一个数据帧,其中一个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           
(在本例中,objectid存储为字符串)

我尝试过这样做:

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

但是我得到一个错误
重新编制索引只对唯一值的索引对象有效
。如何执行此操作并尝试合并字符串?

从合并字符串开始,然后进行分组和聚合:

(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           

如果我有其他几列,是否有方法指定要进行字符串联接的列?@Ddor编辑了我的答案以解决您的问题。