如何实现Pandas不区分大小写重命名重复列名?
实现Pandas不区分大小写的重复列名重命名
问题描述
当加载包含大小写不同及大小写相同的重复列名的数据到Pandas DataFrame时,Pandas仅会自动重命名大小写完全相同的重复列,无法处理大小写不同但实质重复的列名(如Name和name)。需要实现不区分大小写的列名重命名,达到如下效果:
输入数据
------------------------------------------- | id | Name | class | class | name | ------------------------------------------- | 1 | A | 5 | i | W | | 2 | B | 4 | iv | X | | 3 | C | 10 | x | Y | | 4 | D | 8 | viii | Z | -------------------------------------------
Pandas默认输出
---------------------------------------------- | id | Name | class | class .1 | name | ---------------------------------------------- | 1 | A | 5 | i | W | | 2 | B | 4 | iv | X | | 3 | C | 10 | x | Y | | 4 | D | 8 | viii | Z | ----------------------------------------------
期望输出
----------------------------------------------------- | id | Name .1 | class .1 | class .2 | name .2| ----------------------------------------------------- | 1 | A | 5 | i | W | | 2 | B | 4 | iv | X | | 3 | C | 10 | x | Y | | 4 | D | 8 | viii | Z | -----------------------------------------------------
解决方案
通过手动处理列名,先统计不区分大小写的列名重复情况,再按出现顺序添加序号后缀,最后用处理后的列名加载数据。
具体步骤及代码
读取原始表头(避免Pandas自动重命名)
先单独读取数据的表头行,避免Pandas提前修改重复列名:# 假设数据为CSV格式,根据实际分隔符调整 with open('your_data.csv', 'r') as f: # 读取第一行表头,拆分后清理空格 header = [col.strip() for col in f.readline().split('|') if col.strip()]处理列名:添加不区分大小写的重复后缀
统计每个小写列名的总出现次数,再为重复列按出现顺序添加序号:from collections import defaultdict # 统计每个小写列名的总出现次数 total_counts = defaultdict(int) for col in header: total_counts[col.lower()] += 1 # 生成新列名:唯一列保留原名,重复列添加序号后缀 current_counts = defaultdict(int) new_header = [] for col in header: lower_col = col.lower() current_counts[lower_col] += 1 if total_counts[lower_col] == 1: new_header.append(col) else: new_header.append(f"{col} .{current_counts[lower_col]}")用处理后的列名加载数据
import pandas as pd # 加载数据,指定新列名,清理分隔后的空格 df = pd.read_csv('your_data.csv', sep='|', skipinitialspace=True, names=new_header, header=0) # 清理字符串类型列的多余空格 df = df.apply(lambda x: x.str.strip() if x.dtype == "object" else x)
运行结果
处理后的DataFrame列名将完全匹配期望输出,所有不区分大小写的重复列都会被添加上序号后缀,唯一列保留原名。
内容的提问来源于stack exchange,提问作者Ramineni Ravi Teja
相关产品推荐
相关产品推荐

