Pandas如何读取带有多层表头的非扁平化CSV文件?
Pandas读取该类非结构化CSV的最优方案
核心思路是分区域解析+元数据关联,避免直接全量读取导致的表头错位、元信息丢失问题,同时天然支持后续的阈值校验、数据库写入需求。
具体实现步骤
1. 读取参数元数据(前4行)
先提取前4行的下限(ll)、上限(hl)、单位(unit)、参数名(param)映射关系:
import pandas as pd # 读取前4行元数据,无表头 meta_df = pd.read_csv("test.csv", nrows=4, header=None) # 提取参数元信息:第一列为元字段名,F列(索引5)开始为各参数的对应值 param_meta = meta_df.set_index(0).iloc[:, 5:].T # 重置索引后重命名列,得到每个参数的ll/hl/unit映射 param_meta.columns = ["ll", "hl", "unit", "param"] param_meta = param_meta.reset_index(drop=True)
2. 读取主体业务数据
从第4行(param行)开始读取业务明细和维度信息:
# 以第4行(索引3)为表头,读取后续所有业务数据 data_df = pd.read_csv("test.csv", header=3) # 清理第一列空值(样例中第一列除了param行之外都为空) data_df = data_df.drop(columns=data_df.columns[0])
3. 关联元数据实现校验(可选,匹配需求中的阈值校验要求)
如果需要对明细数据做阈值校验,可以直接用元数据关联生成校验结果:
# 把宽表转为长表,方便批量校验 data_long = data_df.melt( id_vars=["SN", "part_no", "date", "passfail"], var_name="param", value_name="val" ) # 关联元数据,自动判断值是否在上下限范围内 data_long = data_long.merge(param_meta, on="param", how="left") data_long["is_valid"] = (data_long["val"] >= data_long["ll"]) & (data_long["val"] <= data_long["hl"])
批量处理优化
如果需要批量处理大量CSV,把上述逻辑封装为函数即可:
- 每处理一个文件返回结构化的
data_long/data_df,直接调用pandas的to_sql方法写入数据库 - 可以搭配
concurrent.futures做多线程并发读取,提升大数量级文件的处理效率
内容的提问来源于stack exchange,提问作者mbadawi23
相关产品推荐
相关产品推荐

