You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效解析含错位列的DataFrame?基于1 Yr Cost提取数据

最优实现方案(基于Python Pandas)

针对这种包含多个错位子表格的CSV,完全不需要低效的逐列循环,利用Pandas的批量处理能力可以高效解决,核心思路是先定位所有子表的表头行,再逐个提取并规整子表,最后合并。

具体步骤

  1. 读取原始CSV(不预设表头)
    因为表头位置不固定,先把所有行当作普通数据读取,保留原始结构。

  2. 定位所有子表的表头行
    遍历所有行,筛选出包含“1 Yr Cost”的行,这些行就是每个子表的表头。

  3. 逐个处理子表
    对每两个相邻表头行之间的区域:

    • 用当前表头行作为子表的列名
    • 提取该子表的有效数据行
    • 根据目标列名(对应你期望的规整格式)对齐数据,缺失的列自动填充空值
  4. 合并所有子表并导出
    将所有规整后的子表纵向合并,得到最终的统一格式数据,再导出为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:37:34