如何高效解析含错位列的DataFrame?基于1 Yr Cost提取数据
最优实现方案(基于Python Pandas)
针对这种包含多个错位子表格的CSV,完全不需要低效的逐列循环,利用Pandas的批量处理能力可以高效解决,核心思路是先定位所有子表的表头行,再逐个提取并规整子表,最后合并。
具体步骤
读取原始CSV(不预设表头)
因为表头位置不固定,先把所有行当作普通数据读取,保留原始结构。定位所有子表的表头行
遍历所有行,筛选出包含“1 Yr Cost”的行,这些行就是每个子表的表头。逐个处理子表
对每两个相邻表头行之间的区域:- 用当前表头行作为子表的列名
- 提取该子表的有效数据行
- 根据目标列名(对应你期望的规整格式)对齐数据,缺失的列自动填充空值
合并所有子表并导出
将所有规整后的子表纵向合并,得到最终的统一格式数据,再导出为CSV。
代码示例
import pandas as pd import numpy as np # 1. 读取原始CSV,不设置表头 raw_df = pd.read_csv("your_raw_data.csv", header=None, dtype=str) # 2. 定位所有包含"1 Yr Cost"的表头行索引 header_indices = raw_df[raw_df.apply(lambda row: any("1 Yr Cost" in str(cell) for cell in row), axis=1)].index.tolist() # 加上最后一行索引,处理最后一个子表 header_indices.append(len(raw_df)) # 3. 初始化最终结果DataFrame final_df = pd.DataFrame() # 替换成你实际需要的规整列名 target_columns = ["产品名称", "1 Yr Cost", "月度费用", "服务类型", ...] # 遍历每个子表 for i in range(len(header_indices)-1): start_idx = header_indices[i] end_idx = header_indices[i+1] # 提取子表的表头行和数据行 sub_header = raw_df.iloc[start_idx].tolist() sub_data = raw_df.iloc[start_idx+1:end_idx] # 给子表设置列名 sub_data.columns = sub_header # 过滤全空的无效行 sub_data = sub_data.dropna(how="all") # 对齐到目标列,缺失列自动补空 sub_data = sub_data.reindex(columns=target_columns) # 合并到最终结果 final_df = pd.concat([final_df, sub_data], ignore_index=True) # 4. 导出规整后的CSV final_df.to_csv("cleaned_data.csv", index=False)
优势说明
- 效率远超逐列循环:利用Pandas的矢量化操作和批量处理逻辑,数据量越大,性能优势越明显。
- 鲁棒性强:不管子表列错位到1-30列的哪个位置,只要表头包含“1 Yr Cost”就能准确定位,自动对齐目标列。
- 易维护:逻辑清晰,调整目标列、修改过滤规则等需求都能快速修改代码实现。
内容的提问来源于stack exchange,提问作者Frankmeister
相关产品推荐
相关产品推荐

