我有以下数据框,其中 ORDER_ID 作为公共(public)列。我必须为 df2 中的每个 ORDER_ID 匹配 EMP_ID。相同的 EMP_ID 可以匹配多个订单。
DF:
ORDER_ID TYPE EMP_ID
0 23991 A 9233
1 31106 A 2457
2 30062 A 2457
3 30062 A 1234
DF2:
ORDER_ID O_INFO YEAR PRICE
0 23991 OK 2011 100
1 31106 OK 2000 200
2 30062 OK 2000 300
输出应该是: 由于一个订单将由许多员工参加,我想对参加该订单的所有员工进行分组和映射
ORDER_ID O_INFO YEAR PRICE EMP_ID
0 23991 OK 2011 100 9233
1 31106 OK 2000 200 2457
2 30062 OK 2000 300 2457,1234
我尝试了如下的 map 功能: df = df.set_index('ORDER_ID')
df2 ['EMP'] = df2[‘ORDER_ID’].map(df[‘EMP_ID'])
我收到错误:因为 ORDER_ID 中的值不唯一,无法设置为索引。但如果不设置索引,map 功能将无法工作。它返回 NaN 值而不设置索引。
InvalidIndexError: Reindexing only valid with uniquely valued Index objects
执行合并不会映射 ORDER 的 EMP_ID,而是再次返回 Nan 值
df.merge(df2, on='ORDER_ID', how='left')
最佳答案
我认为您需要通过ORDER_ID
中的重复项与join
聚合EMP_ID
,然后map
完美工作:
s = df1['EMP_ID'].astype(str).groupby(df1['ORDER_ID']).apply(', '.join)
print (s)
ORDER_ID
23991 9233
30062 2457, 2457
31106 2457
Name: EMP_ID, dtype: object
df2['EMP'] = df2['ORDER_ID'].map(s)
print (df2)
ORDER_ID O_INFO YEAR PRICE EMP
0 23991 OK 2011 100 9233
1 31106 OK 2000 200 2457
2 30062 OK 2000 300 2457, 2457
关于python - Pandas:在映射操作之前设置具有重复值的列的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48336937/