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

Pandas如何统一相似列名格式并删除仅标点/空格差异的重复列

Pandas问卷数据列名规范化与重复列清理方案

你现有代码存在两处核心逻辑错误,无法达到预期效果:

  • df.columns.str.replace(".", " ")会替换列名所有位置的.为空格,既没有覆盖问号、首尾多余空格的处理,还会误修改列名中间合法的点字符
  • drop_duplicates()默认是对行维度做去重,不会处理列方向的重复数据,无法删除冗余重复列

正确处理分两步走:先统一列名格式,再校验删除内容一致的重复列。

第一步:列名规范化清洗

针对问卷列名的常见格式差异,统一执行以下清洗规则,不改动列名中间的有效内容:

  1. 清除列名首尾的所有空白字符
  2. 循环移除列名末尾的句号、问号(包含中英文标点),直到末尾不是这类冗余标点为止
  3. 合并列名中间连续的多余空格为单个空格,消除空格带来的格式差异

对应实现代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 18:42:33