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

如何对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输出均为你需要的格式:

personapple_percentageorange_percentage
Jenny0.250.75
David0.750.25
Max0.500.50

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:06:03