如何修改Pandas多层级DataFrame的索引标签与索引名称
手动修改Pandas多级索引的分步实现
嘿,我来一步步带你手动搞定这个多级索引的修改,完全不用那些一键式的快捷方法,让你彻底搞懂每一步的逻辑~
首先先把你的原始代码再贴一遍,方便我们对照操作:
import pandas as pd import numpy as np outside='g1 g1 g1 g2 g2 g2'.split() inside='1 2 3 1 2 3'.split() hier_index=list(zip(outside,inside)) hier_index= pd.MultiIndex.from_tuples(hier_index) df=pd.DataFrame(np.random.randn(6,3), hier_index, ['a','b','c']) df.index.names = ['Outer Group', 'Inner Numbers']
接下来我们分三个步骤完成所有修改,每一步都清晰展示底层逻辑:
1. 把外层索引的g1、g2改成X、Y
Pandas的多级索引(MultiIndex)本质是由levels(存储每一级的唯一值)和codes(存储每个位置对应levels的下标)组成的。我们可以直接修改外层(第0级)的levels值:
# 取出当前索引的levels和codes,转成列表方便修改 levels = list(df.index.levels) codes = list(df.index.codes) # 修改第0级(外层)的levels:把原有的['g1','g2']换成['X','Y'] levels[0] = ['X', 'Y'] # 用修改后的levels和codes重新构建多级索引,保留原来的索引名称 new_index = pd.MultiIndex(levels=levels, codes=codes, names=df.index.names) # 把新索引赋值给df df.index = new_index
这时候你打印df.index,就能看到外层的g1已经变成X,g2变成Y了。
2. 把X(原g1)对应的内层索引1、2、3改成a、b、c
这一步需要针对外层为X的行,单独修改它们的内层索引值。我们可以先把所有索引转成元组列表,逐个检查修改:
# 获取当前所有索引的元组列表 index_tuples = list(df.index) # 遍历每个元组,修改符合条件的内层值 modified_tuples = [] for outer_val, inner_val in index_tuples: if outer_val == 'X': # 定义内层值的映射关系 inner_mapping = {'1': 'a', '2': 'b', '3': 'c'} modified_tuples.append( (outer_val, inner_mapping[inner_val]) ) else: # 外层是Y的行,内层值保持不变 modified_tuples.append( (outer_val, inner_val) ) # 用修改后的元组重新构建多级索引,保留当前的索引名称 new_index = pd.MultiIndex.from_tuples(modified_tuples, names=df.index.names) df.index = new_index
现在查看df,X组的内层索引已经变成a、b、c,Y组的内层还是原来的1、2、3。
3. 修改索引名称:Outer Group→Level 1,Inner Numbers→Level 2
这一步最简单,直接修改索引的names属性就行:
df.index.names = ['Level 1', 'Level 2']
最终效果验证
运行print(df),你会得到类似这样的结果(数值是随机的,索引结构正确就没问题):
a b c Level 1 Level 2 X a 0.423198 -0.187643 0.945217 b -0.567891 0.321098 -0.765432 c 0.112233 -0.445566 0.778899 Y 1 -0.234567 0.876543 -0.123456 2 0.543210 -0.987654 0.654321 3 -0.333333 0.666666 -0.999999
内容的提问来源于stack exchange,提问作者Deshwal
相关产品推荐
相关产品推荐

