Pandas如何统一相似列名格式并删除仅标点/空格差异的重复列
Pandas问卷数据列名规范化与重复列清理方案
你现有代码存在两处核心逻辑错误,无法达到预期效果:
df.columns.str.replace(".", " ")会替换列名所有位置的.为空格,既没有覆盖问号、首尾多余空格的处理,还会误修改列名中间合法的点字符drop_duplicates()默认是对行维度做去重,不会处理列方向的重复数据,无法删除冗余重复列
正确处理分两步走:先统一列名格式,再校验删除内容一致的重复列。
第一步:列名规范化清洗
针对问卷列名的常见格式差异,统一执行以下清洗规则,不改动列名中间的有效内容:
- 清除列名首尾的所有空白字符
- 循环移除列名末尾的句号、问号(包含中英文标点),直到末尾不是这类冗余标点为止
- 合并列名中间连续的多余空格为单个空格,消除空格带来的格式差异
对应实现代码:
import pandas as pd def normalize_column_name(raw_colname: str) -> str: # 统一转字符串,清除首尾空白 cleaned = str(raw_colname).strip() # 移除末尾冗余的中英文句号、问号 while cleaned and cleaned[-1] in ('.', '?', '。', '?'): cleaned = cleaned[:-1].strip() # 合并中间连续的多余空格 cleaned = ' '.join(cleaned.split()) return cleaned # 读取源数据 df = pd.read_csv(ExlPathName) # 批量规范化所有列名 df.columns = [normalize_column_name(col) for col in df.columns]
用你给出的示例测试:Test1?、Test1.会被统一为Test1,Test2、Test2.会被统一为Test2;末尾带不同标点、多余空格的同问题列名,都会被转换为完全一致的标准名称。
第二步:校验删除重复冗余列
不要直接按列名去重,避免出现不同问题清洗后同名但内容不同的误删情况:只有规范化后列名相同、且列内取值完全一致的列,才判定为冗余列,保留第一列、删除后续重复列;如果同名但内容不一致,自动加后缀区分,避免数据丢失。
对应实现代码:
keep_columns = [] checked_col_set = set() for col in df.columns: # 列名第一次出现,直接保留 if col not in checked_col_set: checked_col_set.add(col) keep_columns.append(col) continue # 列名重复,对比和已保留的同名列内容是否完全一致 is_redundant = False for kept in [c for c in keep_columns if c == col]: if df[col].equals(df[kept]): is_redundant = True break if is_redundant: # 内容完全一致,跳过该列即实现删除 continue else: # 内容不一致,加后缀重命名后保留 suffix = len([c for c in keep_columns if c.startswith(col)]) new_col_name = f"{col}_异值{suffix}" df = df.rename(columns={col: new_col_name}) keep_columns.append(new_col_name) # 生成最终清洗后的数据集 df_cleaned = df[keep_columns]
效果说明
针对你提到的两类典型重复场景:
What do you think about this company?和What do you think about this company.会被合并为同一列,冗余列自动删除I would recommend this company to a friend和带末尾句号、多余空格的同名列会被合并去重- 你给出的4列测试样例(Test1?、Test1.、Test2、Test2.,列值完全一致)处理后会保留2列,完全符合预期
小提示:如果你的问卷存在特殊问题,末尾标点属于核心区分语义,可以调整
normalize_column_name函数里的标点过滤列表适配即可。
内容的提问来源于stack exchange,提问作者Scythor
相关产品推荐
相关产品推荐

