加入多对一的数据帧

时间:2017-07-17 11:30:47

标签: python pandas dataframe many-to-one

我有两个数据框,一个是关于用户的信息,另一个是关于我想要加入的项目交易。

用户df有一个包含最后Trans Ref的列,项目也有Trans Ref,但是当每个用户购买很多东西时,会有多对一的关系。

说我的用户A, B, C有反复引用123, 456, 789

然后我进行了参考交易:

123-001, 123-002, 123-003, 124-004
456-001,
789-001, 789-002, 789-003

我可以剪掉我的反思结尾的项目编号,并将它们与用户匹配(多对一)

如何在Pandas Dataframe中完成这项工作?

1 个答案:

答案 0 :(得分:1)

设定:

用户数据框

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