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

修复Python Pandas重复列名自定义后缀替换函数异常问题

修复重复列名重命名函数的方案

问题背景

读取Excel文件时,Pandas会给重复列自动添加.1、.2这类后缀。现有需求是:移除这些自动添加的数字后缀,为所有重复列(包括无后缀的第一组)按顺序添加自定义后缀列表suffixes = ['Vehicles','Electronics','Real Estate'],让每组重复列对应一个业务分类后缀。

当前函数的问题是未给第一组无数字后缀的重复列添加自定义后缀,导致第一组列名保持原样,不符合预期。

解决方案思路

  1. 提取每个列名的基础名称(去掉.数字后缀部分);
  2. 按基础名称对列进行分组,识别重复列组;
  3. 对每个重复列组,按列的原始顺序分配自定义后缀;
  4. 非重复列保持原名称不变。

修复后的函数代码

import pandas as pd
import re

def change_colnames(df, suffixes):
    # 正则匹配:提取基础名称与可选的数字后缀
    col_pattern = re.compile(r'(.*?)(\.\d+)?$')
    # 按基础名称分组列名
    col_groups = {}
    for col in df.columns:
        match = col_pattern.match(col)
        base_name = match.group(1)
        if base_name not in col_groups:
            col_groups[base_name] = []
        col_groups[base_name].append(col)
    
    new_columns = []
    for base_name, cols in col_groups.items():
        # 组内列数与后缀列表长度匹配时,批量重命名
        if len(cols) == len(suffixes):
            for col, suffix in zip(cols, suffixes):
                new_col = f"{base_name} - {suffix}"
                new_columns.append(new_col)
        else:
            # 非重复列或不匹配后缀长度的组,保留原名
            new_columns.extend(cols)
    
    # 替换列名并返回新DataFrame
    df_copy = df.copy()
    df_copy.columns = new_columns
    return df_copy

测试验证

用示例数据测试:

# 原始数据
original_df= pd.DataFrame({
    'ID': [True, False, True],
    'Revenue (USDm)': [1000, 2000, 1500],
    'Location': ['London', 'New York', 'Paris'],
    'Year': [2021, 2022, 2023],
    'Sold Products': [10, 20, 30],
    'Leased Products': [5, 10, 15],
    'Investments': [7, 12, 8],
    'Sold Products.1': [15, 25, 35],
    'Leased Products.1': [8, 12, 16],
    'Investments.1': [6, 9, 11],
    'Sold Products.2': [5, 10, 15],
    'Leased Products.2': [2, 5, 8],
    'Investments.2': [3, 7, 4],
    'QC Completed?': [True, True, False],
})

# 自定义后缀
suffixes = ['Vehicles','Electronics','Real Estate']

# 调用函数
fixed_df = change_colnames(original_df, suffixes)

# 查看结果
print(fixed_df.columns)

输出列名将完全匹配期望的desired_output结构:

Index(['ID', 'Revenue (USDm)', 'Location', 'Year', 'Sold Products - Vehicles',
       'Leased Products - Vehicles', 'Investments - Vehicles',
       'Sold Products - Electronics', 'Leased Products - Electronics',
       'Investments - Electronics', 'Sold Products - Real Estate',
       'Leased Products - Real Estate', 'Investments - Real Estate',
       'QC Completed?'],
      dtype='object')

关键修复点

  • 不再只处理带.数字后缀的列,而是将所有属于同一基础名称的列视为一个组,包括无后缀的第一组;
  • 通过分组后按原始顺序分配后缀,确保第一组对应suffixes的第一个元素,第二组对应第二个,以此类推;
  • 正则表达式确保准确提取基础名称,避免特殊字符干扰。

内容的提问来源于stack exchange,提问作者A.N.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:07:06