Pandas中MultiIndex列(count)的占比计算需求
给带MultiIndex的Pandas DataFrame计算占比(新增percent列)
嘿,我来帮你搞定这个MultiIndex DataFrame的占比计算问题!我猜你可能卡在了保持原索引结构的同时计算占比——毕竟直接用sum()会扁平化索引,导致无法直接匹配回原数据。下面我给你两种最常见场景的解决方案,附示例代码:
先构造一个示例数据(方便你跟着试)
先造一个带双层MultiIndex的DataFrame,和你的场景对齐:
import pandas as pd data = {'count': [10, 20, 15, 25, 5, 30]} index = pd.MultiIndex.from_tuples( [('A', 'X'), ('A', 'Y'), ('B', 'X'), ('B', 'Y'), ('C', 'X'), ('C', 'Y')], names=['group1', 'group2'] ) df = pd.DataFrame(data, index=index)
输出的df长这样:
count group1 group2 A X 10 Y 20 B X 15 Y 25 C X 5 Y 30
场景1:按某一层索引计算分组内的占比
比如你想算每个group1下,各个group2的count占该组总count的比例,用groupby + transform就能完美解决——transform会返回和原DataFrame同形状的Series,不会破坏MultiIndex结构:
# 按第一层索引group1计算组内占比 df['percent'] = df['count'] / df.groupby(level='group1')['count'].transform('sum') # 如果是按第二层索引group2计算,改level参数就行 # df['percent'] = df['count'] / df.groupby(level='group2')['count'].transform('sum')
计算后df的结果:
count percent group1 group2 A X 10 0.333333 Y 20 0.666667 B X 15 0.375000 Y 25 0.625000 C X 5 0.142857 Y 30 0.857143
场景2:计算全局总计的占比
如果是所有count占全局总count的比例,那就更简单了,直接用全局总和除以每个count即可:
# 先拿到全局总计(你说已经能获取这个值,直接用你的变量就行) total_count = df['count'].sum() # 计算全局占比 df['percent'] = df['count'] / total_count
结果会是每个count占总和(10+20+15+25+5+30=105)的比例:
count percent group1 group2 A X 10 0.095238 Y 20 0.190476 B X 15 0.142857 Y 25 0.238095 C X 5 0.047619 Y 30 0.285714
可选:把占比转成百分比格式
如果想要更直观的百分比显示,可以做个格式化:
# 保留两位小数并转成百分比数值 df['percent'] = (df['percent'].round(4) * 100) # 或者用style美化成带%符号的显示(仅用于展示,不修改数据) df.style.format({'percent': '{:.2f}%'})
这样就能完美保持MultiIndex结构,同时新增你需要的percent列啦!
内容的提问来源于stack exchange,提问作者Tom Kealy
相关产品推荐
相关产品推荐

