代码之家  ›  专栏  ›  技术社区  ›  The Great

熊猫将多个映射到一个,而不是在不删除重复项的情况下合并?

  •  0
  • The Great  · 技术社区  · 2 年前

    我有两个数据帧,如下所示

    data_df = pd.DataFrame({'person_id': ['abc@gmail.com','abc@gmail.com','abc@gmail.com','ace@gmail.com','ace@gmail.com','pqr@gmail.com','pqr@gmail.com'],
                 'company': ['a','a','a','a','a','a','a'],
                 'dept_access':['a1','a1','a1','a1','a2','a2','a2']})
    
    key_df = pd.DataFrame({'p_id': ['abc@gmail.com','xyz@gmail.com','pqr@gmail.com'],
                 'company': ['a','a','a'],
                 'location':['UK','USA','KOREA']})
    

    我的目标是做以下事情

    a) 附加 location 列来自 key df data df

    所以,我尝试了如下的合并选项

    data_df.merge(key_df,left_on='person_id',right_on='p_id',how='left')
    

    但由于合并列中存在重复项,这会导致记录比原始data_df多。

    因此,我想使用 map 据我所知 key_df 将为每个用户提供一个unique_key。所以,我在尝试下面这样的东西

    s = key_df.set_index(['p_id'])['location']
    data_df['location'] = data_df[('person_id')].map(s)
    

    但这并不奏效。

    我希望我的输出有4列,如下所示

    enter image description here

    1 回复  |  直到 2 年前
        1
  •  1
  •   jezrael    2 年前

    在运行良好的数据第二解决方案中,实际数据可以先删除重复项:

    s = key_df.drop_duplicates('p_id').set_index(['p_id'])['location']
    data_df['location'] = data_df[('person_id')].map(s)
    print (data_df)
    
           person_id company dept_access location
    0  abc@gmail.com       a          a1       UK
    1  abc@gmail.com       a          a1       UK
    2  abc@gmail.com       a          a1       UK
    3  ace@gmail.com       a          a1      NaN
    4  ace@gmail.com       a          a2      NaN
    5  pqr@gmail.com       a          a2    KOREA
    6  pqr@gmail.com       a          a2    KOREA