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

Pandas:分组间类别占比差异求和的优雅实现方法

优雅实现两组类别占比的绝对差之和

当然有更省心的方法!完全不用手动提取数值,借助pandas的索引对齐和重塑功能就能轻松搞定,这里给你两种实用的思路:

方法一:转宽表后直接计算

先把你的分组占比结果转换成宽格式(Won和Lost作为列,X/Y/Z作为行),这样对应类别的占比会自动对齐,再计算绝对差求和:

# 1. 将分组结果转为带列名的DataFrame
ratio_df = df.groupby('result')['col_A'].value_counts(normalize=True).reset_index(name='proportion')

# 2. 重塑为宽表,让Won/Lost成为列,col_A的类别成为行
wide_ratio = ratio_df.pivot(index='col_A', columns='result', values='proportion')

# 3. 计算对应类别的绝对差并求和
total_diff = abs(wide_ratio['Won'] - wide_ratio['Lost']).sum()

这种方式逻辑直观,输出的wide_ratio还能让你清晰看到两组的占比对比,方便后续检查。

方法二:利用多级索引直接对齐

如果不想转表,也可以直接通过多级索引提取两组数据,pandas会自动按类别索引对齐:

# 1. 先获取分组占比的Series
ratio_series = df.groupby('result')['col_A'].value_counts(normalize=True)

# 2. 分别提取Won和Lost对应的占比系列
won_props = ratio_series.xs('Won', level='result')
lost_props = ratio_series.xs('Lost', level='result')

# 3. 计算绝对差之和
total_diff = abs(won_props - lost_props).sum()

额外优化:处理缺失类别

如果某组里缺少某个类别(比如Lost组没有Z),可以用fillna(0)补0,避免出现NaN影响计算:

total_diff = abs(won_props.fillna(0) - lost_props.fillna(0)).sum()

两种方法都能得到你想要的结果,完全不用手动复制粘贴数值,既高效又不容易出错!

内容的提问来源于stack exchange,提问作者Edamame

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:32:38