我有一个数据帧,其中一个对象ID映射到一个碰撞ID(不是唯一的)
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
(在这种情况下,对象标识存储为字符串)。
我试图做这样的事情:
df2['objectids'] = df2['collisionid'].map(df1.set_index('collisionid')['objectid'])
但是出现错误Reindexing only valid with uniquely valued Index objects
。我该如何做,还要尝试合并字符串?
答案 0 :(得分:4)
首先合并它们,然后进行分组和聚合:
(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