如何对Pandas多级索引分组统计结果计算bar/foo计数比值?
问题描述
原始数据:
level0 level1 level2 0 0 A foo 1 0 A bar 2 0 B foo 3 0 B foo 4 0 B foo 5 0 B bar 6 1 A foo 7 1 A bar
执行分组计数后得到多级索引结果:
level0 level1 level2 0 A foo 1 bar 1 B foo 3 bar 1 1 A foo 1 bar 1 B foo 1 bar 1 2 A foo 1 bar 1 B foo 1 bar 1
需求:计算每个level0+level1分组下,level2中bar计数与foo计数的比值。
解决方案
方法1:基于已有分组结果处理
先将多级索引的计数结果转换为宽表结构,再直接计算比值:
# 假设已有的分组计数结果为counts counts = df.groupby(['level0', 'level1', 'level2']).size() # 将level2从索引转为列,缺失分组填充0 counts_wide = counts.unstack(level='level2', fill_value=0) # 计算bar/foo比值 bar_foo_ratio = counts_wide['bar'] / counts_wide['foo'] # 可选:转为更易读的格式 bar_foo_ratio = bar_foo_ratio.rename('bar/foo_ratio').reset_index()
执行后得到结果:
level0 level1 bar/foo_ratio 0 0 A 1.000000 1 0 B 0.333333 2 1 A 1.000000 3 1 B 1.000000 4 2 A 1.000000 5 2 B 1.000000
方法2:用pivot_table一步完成统计与计算
直接通过透视表生成foo和bar的计数列,再计算比值,省去单独分组的步骤:
# 生成透视表,统计各分组计数 pivot_df = df.pivot_table( index=['level0', 'level1'], columns='level2', aggfunc='size', fill_value=0 ) # 计算比值 bar_foo_ratio = pivot_df['bar'] / pivot_df['foo']
问题分析
之前用.div或.apply失败,大概率是因为多级索引的结构未处理到位——level2作为索引层级而非列,无法直接针对foo和bar做元素级除法。通过unstack或pivot_table将level2转为列后,就能轻松实现比值计算。
内容的提问来源于stack exchange,提问作者jeff_new
相关产品推荐
相关产品推荐

