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

如何实现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      |
-----------------------------------------------------

解决方案

通过手动处理列名,先统计不区分大小写的列名重复情况,再按出现顺序添加序号后缀,最后用处理后的列名加载数据。

具体步骤及代码

  1. 读取原始表头(避免Pandas自动重命名)
    先单独读取数据的表头行,避免Pandas提前修改重复列名:

    # 假设数据为CSV格式,根据实际分隔符调整
    with open('your_data.csv', 'r') as f:
        # 读取第一行表头,拆分后清理空格
        header = [col.strip() for col in f.readline().split('|') if col.strip()]
    
  2. 处理列名:添加不区分大小写的重复后缀
    统计每个小写列名的总出现次数,再为重复列按出现顺序添加序号:

    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]}")
    
  3. 用处理后的列名加载数据

    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:01:15