Pandas中如何检查重名列的数值是否完全一致以删除重复列
Pandas重名列一致性校验实现方案
实现逻辑
- 自动识别所有重复列名,按同名自动分组,无需手动指定列名
- 对每组重名列逐行校验所有列的数值是否完全一致
- 完全重复的组仅保留1列,存在数值差异的组保留所有列,可自动添加后缀避免后续重名异常
完整实现代码
import pandas as pd import collections # 第一步:统计所有重复列名 col_counter = collections.Counter(df.columns) duplicated_cols = [col for col, cnt in col_counter.items() if cnt > 1] keep_cols = [] processed_cols = set() temp_columns = [] # 先生成临时带后缀的列名,避免重名索引异常 for idx, col in enumerate(df.columns): if col in duplicated_cols: temp_columns.append(f"{col}_{idx}") else: temp_columns.append(col) df_temp = df.copy() df_temp.columns = temp_columns # 第二步:逐组校验重名列一致性 for col in duplicated_cols: # 取出当前组所有同名列 group_cols = [c for c in temp_columns if c.startswith(f"{col}_")] group_df = df_temp[group_cols] # 校验所有列是否和第一列完全相等 all_same = group_df.eq(group_df.iloc[:,0], axis=0).all().all() if all_same: # 完全重复仅保留第一列,后续还原原列名 keep_cols.append((group_cols[0], col)) else: # 存在差异保留所有列,保留后缀区分 keep_cols.extend([(c, c) for c in group_cols]) # 加入所有非重名列 for col in temp_columns: origin_col = col.split("_")[0] if "_" in col else col if origin_col not in duplicated_cols: keep_cols.append((col, origin_col)) # 第三步:生成最终处理后的DataFrame df_result = df_temp[[i[0] for i in keep_cols]] df_result.columns = [i[1] for i in keep_cols]
运行效果说明
针对你提供的示例数据,运行后最终得到的df_result会保留1个ID列、2个TOTAL列,和预期需求完全一致。
常见问题说明
你之前写的判断逻辑if df['ID'] == df['ID'].all() == True存在两处错误:
- 重名列取数时
df['ID']返回的是多列组成的DataFrame,直接和布尔值对比会返回布尔矩阵,不能放在if判断中 all()调用位置错误,应该先做列对比,再调用all()判断全匹配
内容的提问来源于stack exchange,提问作者Nhyi
相关产品推荐
相关产品推荐

