如何将列追加到MultiIndex列DataFrame指定层级的末尾?
解决MultiIndex列DataFrame追加列到指定层级末尾的问题
问题场景
现有两个带MultiIndex(层级为kind和names)列的DataFrame:df和df1,需求是将df1中kind=A、names=potato的列追加到df的kind=A层级的names末尾,得到目标df2。直接使用pandas.concat([df1, df], axis=1).sort_index(level="kind", axis=1)会导致potato列出现在A层级的开头,不符合需求。
原始数据
df数据:
kind A B names u1 u2 u3 y1 y2 Time 0.0 0.5083 0.1007 0.8001 0.7373 0.1387 0.1 0.6748 0.0354 0.0076 0.8421 0.2670 0.2 0.1753 0.1013 0.5231 0.8060 0.0040 0.3 0.5953 0.6505 0.7127 0.0771 0.1023 0.4 0.4409 0.0193 0.6765 0.9800 0.0715
df1数据:
kind A names potato Time 0.0 0.4043 0.1 0.9801 0.2 0.1298 0.3 0.9564 0.4 0.4409
目标df2:
kind A B names u1 u2 u3 potato y1 y2 Time 0.0 0.5083 0.1007 0.8001 0.4043 0.7373 0.1387 0.1 0.6748 0.0354 0.0076 0.9801 0.8421 0.2670 0.2 0.1753 0.1013 0.5231 0.1298 0.8060 0.0040 0.3 0.5953 0.6505 0.7127 0.9564 0.0771 0.1023 0.4 0.4409 0.0193 0.6765 0.4409 0.9800 0.0715
解决方案
方法一:拆分层级后合并
先提取df中kind=A的列,与df1的potato列按顺序合并,再和df中其他层级的列组合:
import pandas as pd # 提取df中kind为A的所有列 a_group = df.loc[:, 'A'] # 将potato列追加到A组末尾 updated_a_group = pd.concat([a_group, df1], axis=1) # 合并更新后的A组与原df的B组列 df2 = pd.concat([updated_a_group, df.loc[:, 'B']], axis=1)
方法二:构造新列索引后重排
通过构造新的MultiIndex列顺序,确保potato列处于A层级末尾,再重新索引DataFrame:
import pandas as pd # 获取原df的列索引列表 original_cols = df.columns.tolist() # 找到A组最后一列的位置,插入新列 last_a_idx = [i for i, col in enumerate(original_cols) if col[0] == 'A'][-1] + 1 original_cols.insert(last_a_idx, ('A', 'potato')) # 合并df与df1,再按新列顺序重排 df2 = df.join(df1).reindex(columns=original_cols)
结果验证
执行上述任一方法后,df2的列结构将与目标一致,potato列会出现在A层级的u3之后,而非开头。
内容的提问来源于stack exchange,提问作者Barzi2001
相关产品推荐
相关产品推荐

