pandas: 重构数据框架

3

我有以下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个回答

3
选项1:重塑您的数据透视表:pt。 使用stack,rename和to_frame:
```python pt.stack().rename_axis(('Year', 'Category')).to_frame('Value') ```
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:使用原始数据框中的set_indexsum

以下是另一种方法,从您的源数据框开始,使用set_indexsum函数并指定level参数,然后使用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

1
不错!看起来 pt.stack().to_frame(name='value') 也可以。 - Johnny Metz
是的,我忘了在 to_frame 中输入名称参数。 - Scott Boston
@jcmetz21...使用“set_index”和“sum”的不同方法更新答案。 - Scott Boston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接