我有以下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
答案 0 :(得分:3)
选项1:重塑您的枢轴数据框:pt
使用stack
,rename
和to_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_index
和sum
以下是从源df开始的另一种方法,使用带有set_index
参数的sum
和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