在Pandas分组中获取每组内各值的计数占比与计数
Pandas分组计算每组内类别计数及占比问题
原始DataFrame
import pandas as pd df = pd.DataFrame({"id":[1,1,1,1,2,2,2], "car":["Volvo","Audi","Volvo","Volvo","VW","Audi","Volvo"]})
需求说明
按id分组后,获取每组内各car值的计数占比(ratio)与具体计数(count),期望得到如下格式的结果:
ratio count car id 1 Audi 0.25 1 Volvo 0.75 3 2 Audi 0.33 1 Volvo 0.33 1 VW 0.33 1
已尝试方法及问题
- 按
id分组后用自定义聚合函数调用value_counts(normalize=True),但结果中ratio以列表形式返回,不符合目标格式 - 按
id和car分组后聚合,得到的ratio全为1.0,因为占比是在car子组内计算,而非id组内的整体占比
解决方案(一次groupby.agg实现)
通过在groupby.agg中为count和ratio分别指定基于value_counts的lambda函数,再调整索引结构即可实现需求:
# 执行聚合并调整索引 result = df.groupby('id')['car'].agg( count=lambda s: s.value_counts(), ratio=lambda s: s.value_counts(normalize=True) ).stack(level=1).swaplevel(0, 1).sort_index() # 可选:将ratio保留两位小数 result['ratio'] = result['ratio'].round(2)
执行后得到的结果与期望格式一致,且仅通过一次分组操作完成,保证了效率。
内容的提问来源于stack exchange,提问作者CutePoison
相关产品推荐
相关产品推荐

