如何对pandas列分组计算占比并生成新的百分比列
实现代码
你可以用以下两种简洁的方式实现需求,第二种对大数据量的处理效率更高:
方式1:链式调用+分组聚合(代码更简洁)
import pandas as pd # 你的初始数据 mydict ={ 'person': ['Jenny', 'Jenny', 'David', 'David', 'Max', 'Max'], 'fruit': ['Apple', 'Orange', 'Apple', 'Orange', 'Apple', 'Orange'], 'eaten': [25, 75, 15, 5, 10, 10] } df = pd.DataFrame(mydict) # 核心转换逻辑 res = df.set_index(['person', 'fruit']) \ .groupby(level='person') \ .apply(lambda x: x / x.sum()) \ .unstack() \ .reset_index() # 格式化列名、保留两位小数 res.columns = ['person', 'apple_percentage', 'orange_percentage'] res = res.round(2)
方式2:transform预计算总和(性能更优)
# 计算每个人的总食用量,匹配到原数据每一行 df['person_total'] = df.groupby('person')['eaten'].transform('sum') # 计算单种水果占个人总食用量的比例 df['percentage'] = df['eaten'] / df['person_total'] # 长表转宽表 res = df.pivot(index='person', columns='fruit', values='percentage') \ .reset_index() \ .rename_axis(None, axis=1) # 格式化列名、保留两位小数 res.columns = ['person', 'apple_percentage', 'orange_percentage'] res = res.round(2)
运行结果
两种方式得到的res输出均为你需要的格式:
| person | apple_percentage | orange_percentage |
|---|---|---|
| Jenny | 0.25 | 0.75 |
| David | 0.75 | 0.25 |
| Max | 0.50 | 0.50 |
内容的提问来源于stack exchange,提问作者Alfie Grace
相关产品推荐
相关产品推荐

