代码之家  ›  专栏  ›  技术社区  ›  Barranka Avinash Babu

大熊猫数据帧中的多索引透视图

  •  0
  • Barranka Avinash Babu  · 技术社区  · 6 年前

    我正在处理一个报表,我需要创建一个透视表。

    背景:

    • 数据有两个日期列:
      • 发起日期
      • 观察日期
    • 每行包含多个值:
      • 付款
      • 平衡

    所以,我的原始数据框架看起来像这样(一个小示例):

    obs_date     orig_date   payments   balance
    2017-09-12   2019-09-12    200.00   1700.00
    2019-09-19   2019-09-12      0.00   1750.00
    2019-09-26   2019-09-12    100.00   1650.00
    2019-09-19   2019-09-19      0.00   1235.00
    2019-09-26   2019-09-19    300.00    950.00
    2019-09-26   2019-09-26     50.00   3435.00
    

    我试过用熊猫 .pivot() 数据帧上的函数,但我得到的是这样的:

                  payments                               balance
    orig_date     2017-09-12   2017-09-19   2017-09-26   2017-09-12   2017-09-19   2017-09-26
    obs_date
    2017-09-12        200.00         0.00       100.00      1700.00      1750.00      1650.00
    2019-09-19                       0.00       300.00                   1235.00       950.00
    2019-09-26                                   50.00                                3435.00
    

    我想要的是这样的:

     obs_date            2017-09-12   2017-09-19   2017-09-26
    orig_date
    2017-09-12 payments      200.00         0.00       100.00
               balance      1700.00      1750.00      1650.00
    2017-09-19 payments                     0.00       300.00      
               balance                   1235.00       950.00
    2017-09-26 payments                                 50.00
               balance                                3435.00
    

    那么,有没有办法得到这个?


    样例代码:

    import pandas as pd
    
    df = pd.DataFrame({
        'obs_date':['2017-09-12', '2017-09-19', '2017-09-26', '2017-09-19', '2017-09-26', '2017-09-26'],
        'orig_date': ['2017-09-12', '2017-09-12', '2017-09-12', '2017-09-19', '2017-09-19', '2017-09-26'],
        'payments': [200.00, 0.00, 100.00, 0.00, 300.00, 50.00],
        'balance': [1700.00,1750.00,1650.00,1235.00,950.00,3435.00]
    })
    
    # My unsuccesful attempt:
    cols = [c for c in df.columns if c not in ['obs_date', 'orig_date']]
    df_pivot = df.pivot(index='orig_date', columns='obs_date', values=cols)
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   BENY    6 年前

    你很快就能修好你的代码 stack

    df_pivot.stack(level=0)
    Out[682]: 
    obs_date             2017-09-12  2019-09-19  2019-09-26
    orig_date                                              
    2019-09-12 balance       1700.0      1750.0      1650.0
               payments       200.0         0.0       100.0
    2019-09-19 balance          NaN      1235.0       950.0
               payments         NaN         0.0       300.0
    2019-09-26 balance          NaN         NaN      3435.0
               payments         NaN         NaN        50.0