python - 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
。我该如何去做这件事并尝试合并字符串?
解决方案
首先合并它们,然后分组和聚合:
(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
推荐阅读
- ruby-on-rails - Rails 5:使用 devise_invitable 设置每日邀请限制
- php - 如何在 Laravel 中限制路线上的字段?
- excel - 如何优化两个范围以确定两条曲线之间的交点
- reactjs - 从反应组件中分离 eventListener
- node.js - 续集:如果包含模型的条件匹配,则不包含模型
- objective-c - 将其他正在运行的应用程序的窗口置于前面
- android - 我们如何从 Fragment 初始化在 LinearLayout 内运行时创建的视图?
- powershell - 使用点表示法导入下标时避免覆盖变量
- android - Kotlin - Mockito 验证方法调用
- javascript - 如何修复加载超过 2 分钟的three.js 并且崩溃