Pandas多层列DataFrame如何将同名顶级列的子列合并分组
Pandas多层列索引同名顶级列子列归集方法
问题原因
你之前使用的df.groupby(df.columns, axis=1)是按照完整的列索引元组(同时匹配顶级列和子列)进行分组,和你只按顶级列归集子列的需求不匹配,因此无法达到预期效果。
实现方案
方案1:保持原有子列相对顺序(适配示例场景,推荐)
该方案不会打乱同个顶级列下子列的原有出现顺序,比如你的场景里原有Num子列早于ProdID出现,归集后依然保持该顺序:
# 提取不重复的顶级列名,保持原有的出现顺序 unique_top_cols = list(dict.fromkeys(df.columns.get_level_values(0))) new_col_order = [] # 遍历每个顶级列,收集其对应的所有子列 for top_col in unique_top_cols: matched_sub_cols = df.columns[df.columns.get_level_values(0) == top_col] new_col_order.extend(matched_sub_cols) # 按新的列顺序重排DataFrame df = df[new_col_order]
方案2:按索引字典序快速排序
如果不需要严格保持子列原有顺序,只需要同顶级列的子列相邻,可以直接用sort_index快速实现:
# axis=1指定对列操作,level=0指定按顶级列索引排序 df = df.sort_index(axis=1, level=0)
方案3:自定义子列排序规则
如果需要固定同顶级列下的子列顺序(比如强制Num永远在ProdID前面),可以自定义排序优先级:
# 定义子列排序优先级,数值越小排名越靠前 sub_priority = {'Num': 0, 'ProdID': 1} df = df.sort_index( axis=1, level=0, # 按自定义优先级对子列排序,未匹配的子列默认排在最后 key=lambda sub_col: sub_col.map(lambda x: sub_priority.get(x, 999)) )
内容的提问来源于stack exchange,提问作者Soumya C
相关产品推荐
相关产品推荐

