如何计算DataFrame中不同分组内各元素的占比?
问题:按指定分组计算元素占比并生成汇总表
给定数据
原始DataFrame
id column1 column2 column3 column4 columns5 1 a b a b x 2 b a c b y 3 c b a c x
指定分组
group_1 = ['a', 'b', 'c'] group_2 = ['x', 'y', 'z']
期望输出
%_a %_b %_c %_x %_y %_z 0.3333 0.4167 0.25 0.667 0.333 0
计算逻辑
- group_1元素占比:统计
column1到column4中各元素出现次数,除以总元素数(3行×4列=12)- a=4/12≈0.3333,b=5/12≈0.4167,c=3/12=0.25
- group_2元素占比:统计
columns5中各元素出现次数,除以总行数(3)- x=2/3≈0.667,y=1/3≈0.333,z=0/3=0
解决方案
以下是基于Pandas的实现代码:
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'id': [1,2,3], 'column1': ['a','b','c'], 'column2': ['b','a','b'], 'column3': ['a','c','a'], 'column4': ['b','b','c'], 'columns5': ['x','y','x'] }) # 处理group_1:计算column1-column4中各元素的占比 group1_cols = ['column1', 'column2', 'column3', 'column4'] # 堆叠多列成一维序列,统计频次,确保包含group_1所有元素(缺失补0) group1_counts = df[group1_cols].stack().value_counts().reindex(group_1, fill_value=0) # 计算占比并保留4位小数 group1_ratio = (group1_counts / df[group1_cols].size).round(4) # 处理group_2:计算columns5中各元素的占比 # 统计频次,确保包含group_2所有元素(缺失补0) group2_counts = df['columns5'].value_counts().reindex(group_2, fill_value=0) # 计算占比并保留3位小数 group2_ratio = (group2_counts / len(df)).round(3) # 合并结果并调整格式 result = pd.concat([group1_ratio, group2_ratio], axis=0) # 重命名列名,转为行格式 result = result.rename(lambda x: f'%_{x}').to_frame().T # 调整显示格式,匹配期望输出 result = result.style.format({ '%_a': '{:.4f}', '%_b': '{:.4f}', '%_c': '{:.4f}', '%_x': '{:.3f}', '%_y': '{:.3f}', '%_z': '{:.0f}' }) # 展示结果 display(result)
代码关键点说明
stack():将column1到column4的多列数据转为一维序列,方便统一统计所有元素的出现次数。reindex():确保分组中所有元素都被纳入统计,未出现的元素频次补0。- 占比计算:group_1用总元素数(列数×行数)做分母,group_2用总行数做分母,完全匹配给定的计算逻辑。
内容的提问来源于stack exchange,提问作者datashout
相关产品推荐
相关产品推荐

