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

如何为Pandas多级列DataFrame添加total列与on%列?

解决多级列DataFrame添加total和on%列的问题

问题分析

你之前的代码无法生效,是因为原DataFrame的列MultiIndex中,每个Room对应的第二级标签只有on和off,不存在total这个标签,直接通过loc赋值会因为列不存在而失败。需要先创建对应的多级列,再进行赋值或合并操作。

解决方案一:分组计算+合并列

import pandas as pd

# 构建原DataFrame
idx = pd.MultiIndex.from_product([['Room 1','Room 2', 'Room 3'],['on','off']])
df = pd.DataFrame([[1,4,3,6,5,15], [3,2,1,5,1,7]], columns=idx)

# 1. 计算每个Room的total值
total_df = df.groupby(level=0, axis=1).sum()
# 为total_df设置匹配原df的多级列索引
total_df.columns = pd.MultiIndex.from_product([total_df.columns, ['total']])
# 合并原df和total_df
df = pd.concat([df, total_df], axis=1)
# 按Room排序列,让total紧跟在对应Room的on/off之后
df = df.sort_index(axis=1)

# 2. 计算每个Room的on%值(on/total,保留两位小数)
on_values = df.xs('on', axis=1, level=1)
total_values = df.xs('total', axis=1, level=1)
on_pct_df = (on_values / total_values).round(2)
# 为on%列设置多级索引
on_pct_df.columns = pd.MultiIndex.from_product([on_pct_df.columns, ['on%']])
# 合并on%列到原df
df = pd.concat([df, on_pct_df], axis=1)
# 再次排序列,让on%紧跟在total之后
df = df.sort_index(axis=1)

print(df)

运行后输出结果:

Room 1          Room 2          Room 3         
        on off total  on%   on off total  on%   on off total  on%
0       1   4     5  0.20    3   6     9  0.33    5  15    20  0.25
1       3   2     5  0.60    1   5     6  0.17    1   7     8  0.12

解决方案二:利用unstack/stack简化操作

通过将多级列转换为行维度,计算后再转换回列维度,代码更简洁:

import pandas as pd

idx = pd.MultiIndex.from_product([['Room 1','Room 2', 'Room 3'],['on','off']])
df = pd.DataFrame([[1,4,3,6,5,15], [3,2,1,5,1,7]], columns=idx)

# 把列的多级索引展开为行
df_unstacked = df.unstack(level=0).unstack(level=0)
# 计算total和on%
df_unstacked['total'] = df_unstacked['on'] + df_unstacked['off']
df_unstacked['on%'] = (df_unstacked['on'] / df_unstacked['total']).round(2)
# 重新转换为多级列结构,并调整顺序
df = df_unstacked.stack().stack(level=0).swaplevel(axis=1).sort_index(axis=1)

print(df)

这个方法会得到和方案一完全一致的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:48:21