将Pandas数据框与不对齐的列合并的问题

时间:2018-10-30 23:51:44

标签: python pandas dataframe

我正在尝试转换和合并两个熊猫数据框,其中一个包含帐户,他们收到存款的部分,他们的存款信息以及他们在哪一天收到存款;另一个具有帐户和提款信息。问题是,出于索引目的,来自一个数据帧的段信息应与另一个数据帧的信息对齐,而不管是否有撤回。

注意:

  • 每个人总会有一个帐户
  • 并非每个人都总会提现
  • 提款数据框的帐户和数据仅在发生提款时存在

帐户数据框代码

http://somewhere.com

帐户数据框

https://somewhere.com

提现数据框代码

accounts = DataFrame({'person':[1,1,1,1,1,2,2,2,2,2],
                         'segment':[1,2,3,4,5,1,2,3,4,5],
                         'date_received':[10,20,30,40,50,11,21,31,41,51],
                         'amount_received':[1,2,3,4,5,6,7,8,9,10]})

accounts = accounts.pivot_table(index=["person"], columns=["segment"])

由于一个人只能有唯一的细分,因此我的列只包含一次唯一的数字,同时仍保留所有数据,这就是为什么此数据框看起来如此不同的原因。

提款数据框

               amount_received        date_received
segment        1  2  3  4   5         1   2   3   4   5
person
1              1  2  3  4   5        10  20  30  40  50
2              6  7  8  9  10        11  21  31  41  51

合并

withdrawals = DataFrame({'person':[1,1,1,2,2],
                         'withdrawal_segment':[1,1,5,2,3],
                         'withdraw_date':[1,2,3,4,5],
                         'withdraw_amount':[10,20,30,40,50]})

withdrawals = withdrawals.reset_index().pivot_table(index = ['index', 'person'], columns = ['withdrawal_segment'])

合并数据框的问题是取款数据框的细分未与科目细分对齐。 所需的数据框应类似于:

                      withdraw_date              withdraw_amount
withdrawal_segment    1    2    3    5           1     2     3     5
index person
0     1               1.0  NaN  NaN  NaN        10.0   NaN   NaN   NaN
1     1               2.0  NaN  NaN  NaN        20.0   NaN   NaN   NaN
2     1               NaN  NaN  NaN  3.0         NaN   NaN   NaN  30.0
3     2               NaN  4.0  NaN  NaN         NaN  40.0   NaN   NaN
4     2               NaN  NaN  5.0  NaN         NaN   NaN  50.0   NaN

我的问题是我似乎无法跨人员和部门合并。我已经考虑过要插入行和列,但是因为我不知道哪些段是和不打算进行撤回,所以这变得很困难。是否可以合并数据框,使它们在人员和细分中排成一行?谢谢!

1 个答案:

答案 0 :(得分:1)

方法1,使用reindex

withdrawals=withdrawals.reindex(pd.MultiIndex.from_product([withdrawals.columns.levels[0],accounts.columns.levels[1]]),axis=1)
merge = accounts.merge(withdrawals, on='person', how='left')
merge
Out[79]: 
        amount_received              date_received                  \
segment               1  2  3  4   5             1   2   3   4   5   
person                                                               
1                     1  2  3  4   5            10  20  30  40  50   
1                     1  2  3  4   5            10  20  30  40  50   
1                     1  2  3  4   5            10  20  30  40  50   
2                     6  7  8  9  10            11  21  31  41  51   
2                     6  7  8  9  10            11  21  31  41  51   
        withdraw_amount                       withdraw_date                     
segment               1     2     3   4     5             1    2    3   4    5  
person                                                                          
1                  10.0   NaN   NaN NaN   NaN           1.0  NaN  NaN NaN  NaN  
1                  20.0   NaN   NaN NaN   NaN           2.0  NaN  NaN NaN  NaN  
1                   NaN   NaN   NaN NaN  30.0           NaN  NaN  NaN NaN  3.0  
2                   NaN  40.0   NaN NaN   NaN           NaN  4.0  NaN NaN  NaN  
2                   NaN   NaN  50.0 NaN   NaN           NaN  NaN  5.0 NaN  NaN 

方法2,使用unstackstack

merge = accounts.merge(withdrawals, on='person', how='left')
merge.stack(dropna=False).unstack()
Out[82]: 
        amount_received              date_received                  \
segment               1  2  3  4   5             1   2   3   4   5   
person                                                               
1                     1  2  3  4   5            10  20  30  40  50   
1                     1  2  3  4   5            10  20  30  40  50   
1                     1  2  3  4   5            10  20  30  40  50   
2                     6  7  8  9  10            11  21  31  41  51   
2                     6  7  8  9  10            11  21  31  41  51   
        withdraw_amount                       withdraw_date                     
segment               1     2     3   4     5             1    2    3   4    5  
person                                                                          
1                  10.0   NaN   NaN NaN   NaN           1.0  NaN  NaN NaN  NaN  
1                  20.0   NaN   NaN NaN   NaN           2.0  NaN  NaN NaN  NaN  
1                   NaN   NaN   NaN NaN  30.0           NaN  NaN  NaN NaN  3.0  
2                   NaN  40.0   NaN NaN   NaN           NaN  4.0  NaN NaN  NaN  
2                   NaN   NaN  50.0 NaN   NaN           NaN  NaN  5.0 NaN  NaN