熊猫:重组DataFrames

时间:2017-07-25 20:16:30

标签: python pandas dataframe

我有以下pandas数据帧和基线值:

df = pd.DataFrame(data=[
    {'yr': 2010, 'month': 0, 'name': 'Johnny', 'total': 50},,
    {'yr': 2010, 'month': 0, 'name': 'Johnny', 'total': 50},
    {'yr': 2010, 'month': 1, 'name': 'Johnny', 'total': 105},
    {'yr': 2010, 'month': 0, 'name': 'Zack', 'total': 90}
])
baseline_value = 100

我根据年,月和名称对数据进行分组和汇总。然后我计算相对于基线值的净额:

pt = pd.pivot_table(data=df, index=['yr', 'month', 'name'], values='total', aggfunc=np.sum)
pt['net'] = pt['total'] - baseline_value
print(pt)
                    total    net
yr    month  name
2010  0      Johnny   100      0
             Zack      90    -10
      1      Johnny   105      5

如何重构此DataFrame,使输出看起来像这样:

                             value
yr    month   name    type
2010  0       Johnny  Total    100
                      Net        0
              Zack    Total     90
                      Net      -10
      1       Johnny  Total    105
                      Net        5

1 个答案:

答案 0 :(得分:3)

  

选项1:重塑您的枢轴数据框:pt

使用stackrenameto_frame

pt.stack().rename('value').to_frame()

输出:

                         value
yr   month name               
2010 0     Johnny total    100
                  net        0
           Zack   total     90
                  net      -10
     1     Johnny total    105
                  net        5
  

选项2使用原始df中的set_indexsum

以下是从源df开始的另一种方法,使用带有set_index参数的sumlevel,然后使用stack重新整形:

baseline_value = 100
(df.set_index(['yr','month','name'])
  .sum(level=[0,1,2])
  .eval('net = @baseline_value - total',inplace=False)
  .stack()
  .to_frame(name='value'))

输出:

                         value
yr   month name               
2010 0     Johnny total    100
                  net        0
           Zack   total     90
                  net       10
     1     Johnny total    105
                  net       -5