使用Pandas计算每位人员各类水果的占比
计算每位人员各类水果的占比(Pandas实现方法)
先构造你提供的示例DataFrame:
import pandas as pd df = pd.DataFrame({ '人员': ['A', 'A', 'A', 'B', 'C', 'A', 'F', 'D'], '水果': ['苹果', '香蕉', '香蕉', '苹果', '香蕉', '苹果', '香蕉', '香蕉'] })
方法一:长表格式输出(直观展示每个人员-水果的占比)
利用groupby结合value_counts的normalize参数直接计算比例:
# 按人员分组,计算组内各水果的占比,转百分比并保留两位小数 result = df.groupby('人员')['水果'].value_counts(normalize=True).mul(100).round(2).reset_index(name='占比(%)') print(result)
输出结果:
人员 水果 占比(%) 0 A 苹果 50.00 1 A 香蕉 50.00 2 B 苹果 100.00 3 C 香蕉 100.00 4 D 香蕉 100.00 5 F 香蕉 100.00
方法二:宽表格式输出(适合对比同一人员的不同水果占比)
用crosstab生成计数表后,按行计算占比:
# 生成人员-水果的计数交叉表 counts = pd.crosstab(df['人员'], df['水果']) # 每行(人员)的水果数量除以该行总数,转百分比并保留两位小数,缺失值填0 percentage = counts.div(counts.sum(axis=1), axis=0).mul(100).round(2).fillna(0) print(percentage)
输出结果:
水果 苹果 香蕉 人员 A 50.00 50.00 B 100.00 0.00 C 0.00 100.00 D 0.00 100.00 F 0.00 100.00
关键逻辑说明
value_counts(normalize=True):返回分组内各元素的占比(0-1之间的小数)div(counts.sum(axis=1), axis=0):让每行的每个数值除以该行的总和,得到该行内各元素的占比mul(100):将比例转换为百分比格式round(2):保留两位小数,可根据需求调整位数
内容的提问来源于stack exchange,提问作者J Lee
相关产品推荐
相关产品推荐

