Python Dataframe 重新格式化列和行布局 --> 按名称列对列进行求和并将结果值添加为同名下的行

问题描述 投票:0回答:1

我有以下示例输入表:

姓名 类别 乘数 计数x乘数
吉姆 类型1 10 1.25 12.5
吉姆 类型2 4 1 4
吉姆 类型3 8 0.5 4
贝丝 类型1 12 1.25 15
贝丝 类型2 2 1 2
贝丝 类型3 3 0.5 1.5

创建此表的代码如下:

import pandas as pd
df = pd.DataFrame({'Name':["Jim","Jim","Jim","Beth","Beth","Beth"], 'Category':['Type 1','Type 2','Type 3','Type 1','Type 2','Type 3'], 'Count':[10,4,8,12,2,3], 'Multiplier':[1.25,1,0.5,1.25,1,0.5], 'CountxMultiplier':[12.5,4,4,15,2,1.5]})

我想按“名称”列对“计数”列求和,并将结果值添加为同名下的附加行。我也想对 CountxMultiplier 列重复此过程。我想要的输出表如下:

姓名 类别 价值
吉姆 类型1 10
吉姆 类型2 4
吉姆 类型3 8
吉姆 总类型数 22
吉姆 总计数x乘数 20.5
贝丝 类型1 12
贝丝 类型2 2
贝丝 类型3 3
贝丝 总类型数 17
贝丝 总计数x乘数 18.5

我彻底搜索了 StackOverflow,但找不到任何执行此特定类型操作的代码。

python format transpose sumifs
1个回答
0
投票

由于最终输出是一个(某种)数据透视表,我们可以首先计算一个计算边距的数据透视表;然后将

CountxMultiplier
总计作为新行添加到此中间数据透视表结果中。由于最终结果是未透视表,因此我们可以调用
unstack
+
reset_index
来获取最终结果。

df1 = (
    df.pivot_table(index='Category', columns='Name', values='Count', aggfunc='sum', margins=True, margins_name='Total Type Count', sort=False)
    .drop(columns='Total Type Count')
)
df1.loc['Total CountxMultiplier'] = df.groupby('Name')['CountxMultiplier'].sum()
df1 = df1.unstack().reset_index(name='Value')

© www.soinside.com 2019 - 2024. All rights reserved.