基于Level 1列重命名Pandas多级列的Level 0
Pandas多级列按Level 1值修改Level 0名称
场景说明
假设存在一个三级列索引的DataFrame,列结构为:(xxx, a, k), (xxx, b, l), (xxx, c, m),需要将Level 1值为b的列对应的Level 0值从xxx改为yyy,最终列名变为:(xxx, a, k), (yyy, b, l), (xxx, c, m)。
实现方法
方法一:遍历列元组逐个修改
先构造示例DataFrame方便测试:
import pandas as pd # 构造三级列索引的示例DataFrame columns = pd.MultiIndex.from_tuples( [('xxx', 'a', 'k'), ('xxx', 'b', 'l'), ('xxx', 'c', 'm')], names=['Level0', 'Level1', 'Level2'] ) df = pd.DataFrame([[1, 2, 3]], columns=columns)
然后遍历列元组,修改符合条件的Level 0值:
new_columns = [] for col in df.columns: # 判断当前列的Level1是否为'b' if col[1] == 'b': # 替换Level0为'yyy',保留其他层级 new_col = ('yyy', col[1], col[2]) new_columns.append(new_col) else: new_columns.append(col) # 更新DataFrame的列索引 df.columns = pd.MultiIndex.from_tuples(new_columns, names=df.columns.names)
方法二:利用set_levels结合布尔掩码(更简洁)
这种方式无需遍历所有列,通过布尔筛选直接定位目标列修改:
import pandas as pd # 构造示例DataFrame(同方法一) columns = pd.MultiIndex.from_tuples( [('xxx', 'a', 'k'), ('xxx', 'b', 'l'), ('xxx', 'c', 'm')], names=['Level0', 'Level1', 'Level2'] ) df = pd.DataFrame([[1, 2, 3]], columns=columns) # 生成Level1为'b'的布尔掩码 mask = df.columns.get_level_values(1) == 'b' # 复制原Level0的取值,修改符合掩码条件的位置 new_level0 = df.columns.get_level_values(0).copy() new_level0[mask] = 'yyy' # 更新列索引的Level0层级 df.columns = df.columns.set_levels(new_level0, level=0)
验证结果
执行后打印df.columns,输出将为:
MultiIndex([('xxx', 'a', 'k'), ('yyy', 'b', 'l'), ('xxx', 'c', 'm')], names=['Level0', 'Level1', 'Level2'])
内容的提问来源于stack exchange,提问作者Michaella
相关产品推荐
相关产品推荐

