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

如何在Pandas的agg方法中使用value_counts并设置normalize=True?

解决分组内类别占比统计问题

你当前用agg结合lambda调用value_counts(normalize=True)的方式,会因为agg对返回的Series处理逻辑,导致结果格式不符合预期。可以改用apply方法来实现分组内各my_other_var类别的占比统计:

import pandas as pd

# 示例数据
df = pd.DataFrame({
    'my_var': ['A', 'A', 'A', 'B', 'B', 'C'],
    'my_other_var': ['X', 'X', 'Y', 'X', 'Y', 'X']
})

# 计算分组内各my_other_var的占比(转为百分比并保留两位小数)
result = df.groupby('my_var')['my_other_var'].apply(
    lambda x: x.value_counts(normalize=True).mul(100).round(2)
).rename('percentage(%)').reset_index()

print(result)

输出示例:

my_var my_other_var  percentage(%)
0      A            X           66.67
1      A            Y           33.33
2      B            X            50.0
3      B            Y            50.0
4      C            X           100.0

原方法失效原因

agg方法期望聚合函数返回标量或固定长度的结果,但pd.value_counts(x, normalize=True)返回的是Series,agg会将这些Series按列堆叠,导致最终结果的索引层级混乱,不符合直观的统计需求。而apply可以直接处理每个分组返回的Series,并将结果规整为统一的DataFrame格式。

另一种更简洁的实现方式:

# 先统计各组合的数量
counts = df.groupby(['my_var', 'my_other_var']).size().rename('count')
# 按my_var分组计算占比
percentages = counts.groupby(level='my_var').apply(lambda x: x/x.sum()).mul(100).round(2).rename('percentage(%)')
# 合并结果
result = pd.concat([counts, percentages], axis=1).reset_index()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:25:11