我有以下示例输入表:
姓名 | 类别 | 数 | 乘数 | 计数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,但找不到任何执行此特定类型操作的代码。
由于最终输出是一个(某种)数据透视表,我们可以首先计算一个计算边距的数据透视表;然后将
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')