python - Pandas:在映射操作之前设置具有重复值的列的索引

标签 python pandas dataframe

我有以下数据框,其中 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/

相关文章:

python - 如何使用KEYDOWN?

python - 合并多个 Pandas 数据帧 - 有些具有共享的唯一 ID,有些具有共享列

python - 仅保留后续行满足条件后的行

python - 如何让 pandas TimedeltaIndex 充当分母?

Python:从列表中删除特定项目的重复项

python - 基于开始和结束列扩展数据框(速度)

python - 如何使用比较其他两列的值创建新列?

python - 数据框列表对应元素的平均值

javascript - 自然语言处理数据库查询

python - 有没有更简单的方法来更改 pandas 数据框的索引值?