为MultiIndex DataFrame新增层级,嵌入子DataFrame的实现方案
解决方案
可以通过pd.concat结合DataFrame.apply实现一步到位的高效处理,自动扩展列的MultiIndex层级:
import pandas as pd import numpy as np # 初始化原DataFrame df = pd.DataFrame(columns=pd.MultiIndex.from_arrays([[100,100],[10,20],[1,3]]), data=np.random.random(12).reshape(6,2)) def get_df(col): return pd.DataFrame({'Double': col*2,'Triple': col*3}) # 核心实现:生成子DataFrame并横向拼接,自动保留原列索引 dg = pd.concat(df.apply(get_df, axis=0), axis=1) # 按需调整列层级顺序(示例:将新增的Transform层级放在最内层) dg.columns = dg.columns.reorder_levels([0,1,2,3])
关键步骤说明
df.apply(get_df, axis=0):对原DataFrame的每一列调用get_df,返回一个由子DataFrame组成的Series,每个子DataFrame包含Double和Triple两列。pd.concat(..., axis=1):将子DataFrame横向拼接,此时列的MultiIndex会自动组合为(原列索引元组, 转换类型)的结构,比如原列(100,10,1)对应新列((100,10,1), 'Double')和((100,10,1), 'Triple')。reorder_levels:可根据需求调整层级顺序,若希望新增的Double/Triple作为最外层,只需传入[3,0,1,2]即可。
可选:给层级命名增强可读性
如果需要更清晰的索引命名,可以补充以下代码:
# 给原MultiIndex列命名 df.columns.names = ['Group', 'SubGroup', 'ID'] # 拼接时指定新增层级的名称 dg = pd.concat(df.apply(get_df, axis=0), axis=1, names=['Transform']) # 调整层级顺序并应用命名 dg.columns = dg.columns.reorder_levels(['Group', 'SubGroup', 'ID', 'Transform'])
内容的提问来源于stack exchange,提问作者germ
相关产品推荐
相关产品推荐

