2016-01-18 33 views
2

我有GROUPBY按客户,年份和月份我的数据框:如何分组熊猫DF条目和进度列值?

my_list = ['Customer','Year','Month'] 
g = df.groupby(my_list)['COST'].sum() 

Customer Year Month COST  
1000061  2013 12  122.77 
      2014 1  450.40 
        2  249.61 
        3  533.58 
        4  337.32 
        5  482.49 
1000063  2013 12  875.67 
      2014 1  376.95 
        2  308.90 
        3  469.76 
        4  394.34 

但是,现在我想添加2个新列(进度列费用,一个或两个possitions): - 在1,预计成本下个月 - 2.第2个月

Customer Year Month COST COST_NextMonth COST_2Months 
1000061 2013 12  122.77 450.40  249.61 
      2014 1  450.40 249.61  533.58 
       2  249.61 533.58  337.32 
       3  533.58 337.32  482.49 
       4  337.32 482.49  0 
       5  482.49 0   0 
1000063 2013 12  875.67 376.95  308.9 
      2014 1  376.95 308.9  469.76 
       2  308.90 469.76  394.34 
       3  469.76 394.34  0 
       4  394.34 0   0 

预期成本如何实现这一目标?

回答

1

IIUC可以使用concatshiftfillna

print pd.concat([g, 
       g.groupby(level=0).shift(-1).fillna(0), 
       g.groupby(level=0).shift(-2).fillna(0)], axis=1,    
       keys=['COST','COST_NextMonth','COST_2Months']) 

         COST COST_NextMonth COST_2Months 
Customer Year Month          
1000061 2013 12  122.77   450.40  249.61 
     2014 1  450.40   249.61  533.58 
       2  249.61   533.58  337.32 
       3  533.58   337.32  482.49 
       4  337.32   482.49   0.00 
       5  482.49   0.00   0.00 
1000063 2013 12  875.67   376.95  308.90 
     2014 1  376.95   308.90  469.76 
       2  308.90   469.76  394.34 
       3  469.76   394.34   0.00 
       4  394.34   0.00   0.00 

reset_index下一个解决方案:

df['COST_NextMonth'] = g.reset_index().groupby('Customer')['COST'].shift(-1).fillna(0) 
df['COST_2Months'] = g.reset_index().groupby('Customer')['COST'].shift(-2).fillna(0) 
print df 

    Customer Year Month COST COST_NextMonth COST_2Months 
0 1000061 2013  12 122.77   450.40  249.61 
1 1000061 2014  1 450.40   249.61  533.58 
2 1000061 2014  2 249.61   533.58  337.32 
3 1000061 2014  3 533.58   337.32  482.49 
4 1000061 2014  4 337.32   482.49   0.00 
5 1000061 2014  5 482.49   0.00   0.00 
6 1000063 2013  12 875.67   376.95  308.90 
7 1000063 2014  1 376.95   308.90  469.76 
8 1000063 2014  2 308.90   469.76  394.34 
9 1000063 2014  3 469.76   394.34   0.00 
10 1000063 2014  4 394.34   0.00   0.00 
+0

你的答案是非常赞赏。谢谢 –

+0

很高兴能帮助你!祝你好运! – jezrael