做大熊猫的左边有多个值,右边有多个值

时间:2020-02-19 12:04:59

标签: python pandas join

我正在寻求帮助将熊猫中的两个数据集结合起来。

我的第一个数据集是联系人数据集,包括姓名和ID。第二个是交易数据集,其中除其他字段外,还包含一列,其中包含多个逗号分隔的联系人ID。我想将交易数据集加入到联系人数据集中,其中联系人ID与“关联联系人”字段中的ID之一匹配。

  File "/pathtofile.py", line 21, in __init__
    super().__init__(database=MY_DB, name="my_collection")
  File "/usr/local/lib/python3.7/site-packages/motor/core.py", line 678, in __init__
    super(self.__class__, self).__init__(delegate)
TypeError: __init__() missing 1 required positional argument: 'name'

我已将交易数据框中的联系人分为四个不同的列:

contacts_df = pd.DataFrame(
  {'name': ['John Smith', 'Jane Doe', 'James Bond'],
  'id': [1,2,3]}
  

deals_df = pd.DataFrame(
  {'deal_name': ['McDonalds', 'KFC'],
  'associated_contacts':['1,3','2']}

并尝试将其加入到联系人数据集中:

deals_df[['Contact ID 1','Contact ID 2','Contact ID 3', 'Contact ID 4']] = deals_df['associated_contacts'].str.split(',',expand=True)

但这返回了ValueError:

merged = contacts_df.merge(deals_df, how='left', left_on='id', 
                    right_on=['Contact ID 1','Contact ID 2','Contact ID 3','Contact ID 4'])

有人可以帮助我加入这两个数据集吗?我认为在我的数据集中,每个联系人只会与一个交易相关联。但是一笔交易可以有多个联系人,我希望看到与每个交易相关的交易。

1 个答案:

答案 0 :(得分:0)

对于由associated_contacts分割的,的重复值,请使用DataFrame.explode(大熊猫0.25+),还必须将列id转换为整数:

deals_df = (deals_df.assign(id = deals_df.pop('associated_contacts').str.split(','))
                    .explode('id')
                    .assign(id = lambda x: x['id'].astype(int)))
print (deals_df)
   deal_name  id
0  McDonalds   1
0  McDonalds   3
1        KFC   2

您的解决方案应使用DataFrame.stackDataFrame.join更改为原始格式:

deals_df = (deals_df.join(deals_df.pop('associated_contacts')
                                  .str.split(',', expand=True)
                                  .stack()
                                  .astype(int)
                                  .reset_index(level=1, drop=True)
                                  .rename('id')))
print (deals_df)
0  McDonalds   1
0  McDonalds   3
1        KFC   2

然后仅将merge与参数on一起使用:

merged = contacts_df.merge(deals_df, how='left', on='id')
print (merged)
         name  id  deal_name
0  John Smith   1  McDonalds
1    Jane Doe   2        KFC
2  James Bond   3  McDonalds