加入多对一的数据框
Joining Dataframes Many to One
我有两个数据框,一个是关于用户的信息,另一个是关于我想要合并的物品交易的信息。
用户 df 有一个包含最后一个 Trans Ref 的列,项目也有一个 Trans Ref,但是由于每个用户购买很多东西,因此存在多对一关系。
假设我有用户 A, B, C
和 trans refs 123, 456, 789
然后我与参考进行了交易:
123-001, 123-002, 123-003, 124-004
456-001,
789-001, 789-002, 789-003
我可以从我的 trans refs 的末端切掉项目编号并将它们与用户匹配(多对一)
如何在 Pandas Dataframe 中完成此操作?
设置:
用户数据框
users_df = pd.DataFrame({'UserID':['A','B','C'],'Trans Ref':[123,456,789]})
Trans Ref UserID
0 123 A
1 456 B
2 789 C
交易数据帧
trans_df = pd.DataFrame({'Tran Refs':[['123-001','123-002','123-002','123-004'],
['456-001'],['789-001','789-002','789-003']],
'Trans Description':['Transaction Info 123',
'Transaction Info 456',
'Transaction Info 789']})
Tran Refs Trans Description
0 [123-001, 123-002, 123-002, 123-004] Transaction Info 123
1 [456-001] Transaction Info 456
2 [789-001, 789-002, 789-003] Transaction Info 789
重塑 trans_df 并与 users_df 多对一合并。
df_out = (trans_df.set_index('Trans Description')['Tran Refs']
.apply(lambda x:pd.Series(x))
.stack()
.str.split('-').str[0] #trim -00x from trans ref
.astype(int)
.reset_index(name='Trans Ref')
.drop('level_1',axis=1)
.merge(users_df, on='Trans Ref')) #join to users_df on Trans Ref
输出:
Trans Description Trans Ref UserID
0 Transaction Info 123 123 A
1 Transaction Info 123 123 A
2 Transaction Info 123 123 A
3 Transaction Info 123 123 A
4 Transaction Info 456 456 B
5 Transaction Info 789 789 C
6 Transaction Info 789 789 C
7 Transaction Info 789 789 C
我有两个数据框,一个是关于用户的信息,另一个是关于我想要合并的物品交易的信息。
用户 df 有一个包含最后一个 Trans Ref 的列,项目也有一个 Trans Ref,但是由于每个用户购买很多东西,因此存在多对一关系。
假设我有用户 A, B, C
和 trans refs 123, 456, 789
然后我与参考进行了交易:
123-001, 123-002, 123-003, 124-004
456-001,
789-001, 789-002, 789-003
我可以从我的 trans refs 的末端切掉项目编号并将它们与用户匹配(多对一)
如何在 Pandas Dataframe 中完成此操作?
设置:
用户数据框
users_df = pd.DataFrame({'UserID':['A','B','C'],'Trans Ref':[123,456,789]})
Trans Ref UserID
0 123 A
1 456 B
2 789 C
交易数据帧
trans_df = pd.DataFrame({'Tran Refs':[['123-001','123-002','123-002','123-004'],
['456-001'],['789-001','789-002','789-003']],
'Trans Description':['Transaction Info 123',
'Transaction Info 456',
'Transaction Info 789']})
Tran Refs Trans Description
0 [123-001, 123-002, 123-002, 123-004] Transaction Info 123
1 [456-001] Transaction Info 456
2 [789-001, 789-002, 789-003] Transaction Info 789
重塑 trans_df 并与 users_df 多对一合并。
df_out = (trans_df.set_index('Trans Description')['Tran Refs']
.apply(lambda x:pd.Series(x))
.stack()
.str.split('-').str[0] #trim -00x from trans ref
.astype(int)
.reset_index(name='Trans Ref')
.drop('level_1',axis=1)
.merge(users_df, on='Trans Ref')) #join to users_df on Trans Ref
输出:
Trans Description Trans Ref UserID
0 Transaction Info 123 123 A
1 Transaction Info 123 123 A
2 Transaction Info 123 123 A
3 Transaction Info 123 123 A
4 Transaction Info 456 456 B
5 Transaction Info 789 789 C
6 Transaction Info 789 789 C
7 Transaction Info 789 789 C