我正在寻求帮助将熊猫中的两个数据集结合起来。
我的第一个数据集是联系人数据集,包括姓名和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'])
有人可以帮助我加入这两个数据集吗?我认为在我的数据集中,每个联系人只会与一个交易相关联。但是一笔交易可以有多个联系人,我希望看到与每个交易相关的交易。
答案 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.stack
和DataFrame.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