使用pd.read_csv导入含重复列名的CSV文件问题
解决Pandas导入重复列名CSV的问题
核心思路
Pandas默认会合并重复列名,且usecols中的重复列名只会匹配第一个出现的列,直接用原方法无法保留所有重复列。解决步骤是先读取原始列名并处理重复项,再用处理后的唯一列名重新读取文件。
完整代码示例
import pandas as pd from collections import defaultdict # 1. 读取原始表头(仅读第一行) original_columns = pd.read_csv('new.csv', nrows=0).columns.tolist() # 2. 处理重复列名,生成唯一列名 col_counts = defaultdict(int) unique_columns = [] for col in original_columns: col_counts[col] += 1 if col_counts[col] > 1: # 给重复列添加后缀,如Row B_1、Row B_2 unique_columns.append(f"{col}_{col_counts[col]-1}") else: unique_columns.append(col) # 3. 用处理后的列名读取完整数据 df = pd.read_csv('new.csv', header=0, names=unique_columns, sep=',')
按需筛选列的扩展方案
如果不需要导入所有列,而是指定保留Row A、所有Row B和Row C,可以在读取时筛选对应列的索引:
# 定义需要保留的原始列名 target_cols = ["Row A", "Row B", "Row C"] # 获取目标列的索引(包括所有重复的Row B) target_indices = [i for i, col in enumerate(original_columns) if col in target_cols] # 筛选出对应的唯一列名 filtered_unique_cols = [unique_columns[i] for i in target_indices] # 读取指定列 df = pd.read_csv('new.csv', header=0, usecols=target_indices, names=filtered_unique_cols, sep=',')
为什么原代码无效?
你之前使用的usecols=["Row A", "Row B", "Row B", "Row C"]中,重复的Row B会被Pandas视为同一个列,只会匹配文件中第一个出现的Row B列,因此无法读取后续的重复列。通过先处理列名再读取的方式,能确保每一列都被正确识别和命名。
内容的提问来源于stack exchange,提问作者Oliver T.
相关产品推荐
相关产品推荐

