修复Python Pandas重复列名自定义后缀替换函数异常问题
修复重复列名重命名函数的方案
问题背景
读取Excel文件时,Pandas会给重复列自动添加.1、.2这类后缀。现有需求是:移除这些自动添加的数字后缀,为所有重复列(包括无后缀的第一组)按顺序添加自定义后缀列表suffixes = ['Vehicles','Electronics','Real Estate'],让每组重复列对应一个业务分类后缀。
当前函数的问题是未给第一组无数字后缀的重复列添加自定义后缀,导致第一组列名保持原样,不符合预期。
解决方案思路
- 提取每个列名的基础名称(去掉
.数字后缀部分); - 按基础名称对列进行分组,识别重复列组;
- 对每个重复列组,按列的原始顺序分配自定义后缀;
- 非重复列保持原名称不变。
修复后的函数代码
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.
相关产品推荐
相关产品推荐

