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
相关产品推荐
相关产品推荐

