Python Pandas读取CSV时空值行、分隔符导致数据解析异常问题
问题修复方案
根因说明
- 源CSV里仅含逗号、无实际内容的行本质是全空记录,pandas默认读取时会把这类行加载为全NaN值的无效行,不需要手动编辑源文件
- 手动删除单个单元格的操作破坏了CSV的分隔符对齐规则:CSV按行以逗号分割匹配字段位置,单独删除某行开头的逗号会让该行所有字段向前偏移一列,直接触发解析错位
- 原代码里用的
DataFrame.append()已经在Pandas 1.4.0之后被废弃,循环追加不仅效率低,还容易出现索引重复的问题
可直接运行的修复代码
import pandas as pd import os input_loc = "./SalesAnalysis/Sales_Data/" output_loc = "./SalesAnalysis/korbi_output/" # 自动创建输出目录,避免路径不存在报错 os.makedirs(output_loc, exist_ok=True) # 提前过滤出csv文件,减少循环判断 csv_files = [f for f in os.listdir(input_loc) if f.endswith(".csv")] df_list = [] for file in csv_files: file_path = os.path.join(input_loc, file) # 读取阶段做好容错配置 df = pd.read_csv( file_path, skip_blank_lines=True, # 读取时自动跳过全空行 na_values=["", " "], # 把空字符串、纯空格统一识别为空值NaN on_bad_lines="skip" # 自动跳过格式严重损坏的异常行,避免解析报错 ) df_list.append(df) # 一次性合并所有表格,替代循环append,性能更好且无版本兼容问题 all_months_data = pd.concat(df_list, ignore_index=True) # 分层清理空值,避免误删有效数据 # 第一步:删除所有字段全为空的行 all_months_data.dropna(how="all", inplace=True) # 第二步:删除核心必填字段为空的坏行,列名和你数据集的实际字段保持一致即可 required_columns = ["Order ID", "Product", "Quantity Ordered", "Price Each", "Order Date", "Purchase Address"] all_months_data.dropna(subset=required_columns, how="any", inplace=True) # 重置索引 all_months_data.reset_index(drop=True, inplace=True) # 导出时关闭索引输出,避免生成多余的无意义列 all_months_data.to_csv(os.path.join(output_loc, "all_months_data.csv"), index=False) # 打印前5行验证结果 print(all_months_data.head())
关键注意事项
- 禁止手动编辑源CSV文件做数据清理:CSV是纯文本结构化格式,手动修改单个单元格很容易破坏分隔符对齐规则,所有清理逻辑都要放在代码中做可复现的批量处理
- 空行清理分两层执行:先删全空行,再删核心字段缺失的坏行,不会误删存在部分空值但有有效业务信息的记录
- 路径拼接用
os.path.join()替代字符串直接相加,兼容Windows、macOS、Linux不同系统的路径分隔符规则 - 导出CSV必须加
index=False参数,否则会把pandas默认生成的行索引作为额外列写入文件,导致后续读取出现多余列
内容的提问来源于stack exchange,提问作者fbn001
相关产品推荐
相关产品推荐

