使用Pandas合并多结构相似CSV文件及dropna失效问题排查
问题分析与解决:合并CSV后执行dropna得到空DataFrame
错误核心原因
- 强制指定列名但未匹配真实数据:你用
names=cols固定了402列,但CSV实际列数可能不符,无效行(如表头、说明行)的列数远少于402,会被填充为全NaN;若分隔符设置错误(比如用了sep="\t"但实际是逗号分隔),有效数据行也会出现大量NaN,how='any'会删除所有含NaN的行,最终导致空DataFrame。 - 路径拼接错误:
path + file如果path末尾没有/,会生成错误路径(如/path1234test.csv),读取失败后生成空DataFrame拉低整体数据质量。 - 未过滤非CSV文件:
os.listdir(path)会返回文件夹内所有文件,读取非CSV文件会产生大量无效NaN行。
解决步骤
1. 修复路径与文件过滤
先确保只读取CSV文件,用标准方法拼接路径避免错误:
import pandas as pd import os path = '/path1234' # 仅保留CSV文件,用os.path.join安全拼接路径 dataset_list = [os.path.join(path, file) for file in os.listdir(path) if file.endswith('.csv')]
2. 单个文件先清理无效行再合并
不直接强制列名,先识别每个CSV的有效数据起始行,再读取清理:
def load_clean_csv(file_path): # 先读取所有行,定位有效数据的起始位置 with open(file_path, 'r') as f: lines = f.readlines() # 找到第一个列数最多的行(默认有效数据行的列数是固定且最多的) valid_start_idx = 0 max_col_count = 0 for idx, line in enumerate(lines): # 根据实际分隔符调整,比如逗号分隔用',' current_col_count = len(line.strip().split(',')) if current_col_count > max_col_count: max_col_count = current_col_count valid_start_idx = idx # 从有效起始行开始读取数据,自动识别表头(若有效行是表头) df = pd.read_csv(file_path, skiprows=valid_start_idx, sep=',') # 仅删除全空的行,保留含部分NaN的有效行 df.dropna(axis=0, how='all', inplace=True) return df # 合并所有清理后的CSV文件 df = pd.concat([load_clean_csv(file) for file in dataset_list], ignore_index=True)
3. 处理列名不一致的情况
如果不同CSV列名有差异,可统一列名或保留共同列:
# 收集所有文件的列名 all_columns = set() for file in dataset_list: temp_df = load_clean_csv(file) all_columns.update(temp_df.columns) # 合并时统一列名,缺失列填充空值 df_list = [] for file in dataset_list: temp_df = load_clean_csv(file) # 补充缺失的列 for col in all_columns: if col not in temp_df.columns: temp_df[col] = pd.NA df_list.append(temp_df) df = pd.concat(df_list, ignore_index=True)
内容的提问来源于stack exchange,提问作者ODE4
相关产品推荐
相关产品推荐

