如何在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
相关产品推荐
相关产品推荐

