You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 07:17:43