【问题标题】:Pandas create a new column based on non-unique column matches, concatenating stringsPandas 根据非唯一列匹配创建一个新列,连接字符串
【发布时间】:2020-07-04 07:49:01
【问题描述】:

我有一个数据框,其中一个 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。我该如何做这件事并尝试合并字符串?

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

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

    (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 编辑了我的答案以解决您的问题。
    猜你喜欢
    • 2019-04-17
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 2018-08-25
    • 1970-01-01
    相关资源
    最近更新 更多