You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python:选择性更新DataFrame多级列名(指定文本列重命名)

解决多级列名选择性更新的问题

我来帮你搞定这个多级列名修改的事儿!先理清楚你的场景:你的DataFrame有两级列索引,前两列的第二级是空字符串,后面的列第一级是_id、第二级是日期字符串。你之前的代码有几个小问题导致跑不起来,我给你拆解下并给出可行方案。

先说说你原来代码的问题

  1. 语法错误:names=.columns.names少了df,应该是names=df.columns.names
  2. 元组格式错误:(s2)不是合法的元组(括号里单个元素要加逗号,比如(s2,)),而且多级索引的每个元素必须是等长元组,你这里前两列是(S1, '')这种结构,不能只返回单元素
  3. 判断逻辑不对:你的日期列是字符串格式(比如07-08-2016 00:00),不是datetime.date对象,用isinstance(s1, datetime.date)根本匹配不到

正确的实现步骤

假设你要把所有第一级包含_id的列,第一级名称改成updated_id(你可以根据自己的需求调整匹配规则和新名称),具体代码如下:

1. 先构造你的示例DataFrame(方便测试)

import pandas as pd

# 还原你的多级列结构
columns = pd.MultiIndex.from_tuples(
    [('S1', ''), ('S2', ''), ('_id', '07-08-2016 00:00'), ('_id', '14-08-2016 00:00')],
    names=['Level1', 'Level2']
)
df = pd.DataFrame(
    [['ABC', 'ABC1', 22071, 19474], ['CDE', 'CDE1', 17, 3]],
    columns=columns
)

2. 选择性修改多级列名

用列表推导式遍历每个列的元组,根据规则修改:

# 定义修改规则:如果第一级是"_id",就改成"updated_id",否则保留原名称
new_columns = pd.MultiIndex.from_tuples(
    [('updated_id' if level1 == '_id' else level1, level2) 
     for level1, level2 in df.columns],
    names=df.columns.names
)

# 给DataFrame设置新的列索引
df.columns = new_columns

3. 验证结果

打印修改后的列名:

print(df.columns)

输出会是:

MultiIndex([('S1',                   ''),
            ('S2',                   ''),
            ('updated_id', '07-08-2016 00:00'),
            ('updated_id', '14-08-2016 00:00')],
           names=['Level1', 'Level2'])

灵活调整匹配规则

如果你需要匹配其他条件,比如:

  • 匹配第二级是日期格式的列:可以用字符串判断,比如if '-' in level2
  • 匹配包含特定文本的列:比如if 'id' in level1.lower()

只需要把列表推导式里的判断条件换成你需要的就行,比如:

# 把第二级包含日期的列的第一级改成"date_id"
new_columns = pd.MultiIndex.from_tuples(
    [('date_id' if '-' in level2 else level1, level2) 
     for level1, level2 in df.columns],
    names=df.columns.names
)

这样就能根据你的需求灵活修改多级列名啦!

内容的提问来源于stack exchange,提问作者Devarshi Mandal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:17:17