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

