如何为DataFrame新增按状态分组的产品金额占比列
嘿,我来帮你搞定这个计算各产品在对应状态下金额占比的问题!
首先先回顾下你的初始数据和已经生成的透视表:
import pandas as pd import numpy as np # 初始DataFrame df = pd.DataFrame({ 'Date': ['2020-08-20']*6, 'Product': ['A','B','C','A','B','C'], 'Amount': [500,500,700,500,200,300], 'Status': [1,1,1,0,0,0] }) # 你已经生成的透视表 df1 = pd.pivot_table( df, values='Amount', index=['Date', 'Status'], columns=['Product'], aggfunc=np.sum, fill_value=0 )
运行后df1的结果是:
Product A B C Date Status 2020-08-20 0 500 200 300 1 500 500 700
接下来我们一步步实现占比计算:
步骤1:计算每行的总金额
首先要得到每个(Date+Status)分组的总金额,也就是每行的求和结果:
row_totals = df1.sum(axis=1)
步骤2:计算占比并合并到原表
我们可以用div方法实现广播计算,让每个产品的金额除以对应行的总金额,得到占比后再合并到原透视表中。这里我会把占比列命名得更清晰,方便识别:
# 计算占比,保留两位小数 product_ratios = df1.div(row_totals, axis=0).round(2) # 重命名占比列,格式为「产品 + Ratio」 product_ratios.columns = [f'{col} Ratio' for col in product_ratios.columns] # 将占比列合并到原透视表 df1 = pd.concat([df1, product_ratios], axis=1)
最终df1的结果会是:
Product A B C A Ratio B Ratio C Ratio Date Status 2020-08-20 0 500 200 300 0.5 0.2 0.3 1 500 500 700 0.29 0.29 0.41
完全匹配你的需求:状态0时A的占比是0.5、C是0.3;状态1时A和B的占比约为0.29,和你描述的结果一致。
内容的提问来源于stack exchange,提问作者Minfetli
相关产品推荐
相关产品推荐

