在Pandas数据透视表中添加计算字段

时间:2017-01-18 16:34:28

标签: python pandas

我想像在excel中那样将计算字段添加到Pandas数据透视表。我计划将totals添加到pivot table,因此我希望计算在pd.pivot_table()内进行。我的数据看起来像这样:

df = {'name' : ['AAA','BBB','CCC','AAA'],
      'product' : ['X','Y','Z','W'],
      'Jan-2016' : [50,55,80,150],
      'Feb - 2016' :[35,55,10,100],
      'Jan-2017' : [25,27,40,20],
      'Feb - 2017' : [55,25,40,65]}
df = pd.DataFrame(df)

pd.pivot_table(df, values=['Jan-2016','Feb-2016','Jan-2017','Feb-2017','YTD YOY - Jan'],index=['name', 'product'])

              Feb-2016  Feb-2017  Jan-2016  Jan-2017
name product                                        
AAA  W             100        65       150        20
     X              35        55        50        25
BBB  Y              55        25        55        27
CCC  Z              10        40        80        40

我想在数据透视表中添加一个计算字段,如下所示:

              Feb-2016  Feb-2017  Jan-2016  Jan-2017  YTD YOY - Jan
name product                                                       
AAA  W           100.0     65.00    150.00      20.0      -0.866667
     X            35.0     55.00     50.00      25.0      -0.500000
BBB  Y            55.0     25.00     55.00      27.0      -0.509091
CCC  Z            10.0     40.00     80.00      40.0      -0.500000

提前致谢!

1 个答案:

答案 0 :(得分:0)

更新的解决方案

根据我的理解,您仍然不需要数据透视表。

首先设置您的索引,然后堆叠并获取pct_change然后unstack,并仅使用filter过滤2017列。最后,将它们连接在一起。

df1 = df.set_index(['name', 'product'])
df2 = df1.stack().pct_change().unstack(-1).filter(like='2017')
df2.columns = 'YTD YOY - ' + df2.columns.str.slice(0,3)
df_final = pd.concat([df1, df2], axis=1)

               Feb - 2016  Feb - 2017  Jan-2016  Jan-2017  YTD YOY - Feb  \
name product                                                              
AAA  W               100          65       150        20      -0.350000   
     X                35          55        50        25       0.571429   
BBB  Y                55          25        55        27      -0.545455   
CCC  Z                10          40        80        40       3.000000   

              YTD YOY - Jan  
name product                 
AAA  W            -0.866667  
     X            -0.500000  
BBB  Y            -0.509091  
CCC  Z            -0.500000 

原始解决方案

您的计算不需要数据透视表。您只需设置索引,然后调用pct_change方法。

df = df.set_index('names')
df['YTD YOY'] = df.pct_change(axis=1).dropna(axis=1)


       Jan-2016  Jan-2017   YTD YOY
names                              
AAA          50        25 -0.500000
BBB          55        27 -0.509091
CCC          80        40 -0.500000