Python:选择性更新DataFrame多级列名(指定文本列重命名)
解决多级列名选择性更新的问题
我来帮你搞定这个多级列名修改的事儿!先理清楚你的场景:你的DataFrame有两级列索引,前两列的第二级是空字符串,后面的列第一级是_id、第二级是日期字符串。你之前的代码有几个小问题导致跑不起来,我给你拆解下并给出可行方案。
先说说你原来代码的问题
- 语法错误:
names=.columns.names少了df,应该是names=df.columns.names - 元组格式错误:
(s2)不是合法的元组(括号里单个元素要加逗号,比如(s2,)),而且多级索引的每个元素必须是等长元组,你这里前两列是(S1, '')这种结构,不能只返回单元素 - 判断逻辑不对:你的日期列是字符串格式(比如
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
相关产品推荐
相关产品推荐

