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

如何使用pandas将网页提取的非规范表格转换为目标结构

Pandas 错位混杂表格规整方案

你的原始表属于典型的合并单元格类爬虫错位表,规律非常明确:Price列为空的行是地区标题行,该行Locality值为地区名,后续紧邻的非空Price行属于该地区,且这些行的Locality列实际存储的是年份数据,不需要复杂循环,用pandas自带的填充、过滤功能就能快速完成转换。

核心处理逻辑

  • 识别所有Price为空的地区行,提取其Locality值作为当前分组的地区名
  • 用向前填充(ffill)把地区名补全到该地区下所有年份行
  • 过滤掉无价格的地区标题行,将剩余行原Locality列重命名为Year列
  • 调整列顺序、转换字段类型得到最终规范表

完整实现代码

import pandas as pd
import numpy as np

# --------------------------
# 这里替换成你自己的表格读取代码即可,比如用pd.read_html爬取的表格直接赋值给df
# 以下为复现你提供的原始表结构的测试数据
raw_data = [
    ["Loc1", np.nan],
    ["2001", 102],
    ["2002", 105],
    ["Loc2", np.nan],
    ["2001", 206],
    ["2002", 209],
    ["Loc3", np.nan],
    ["2001", 412],
    ["2002", 585]
]
df = pd.DataFrame(raw_data, columns=["Locality", "Price"])
# --------------------------

# 核心转换逻辑
# 提取地区名,向前填充到对应下属行
df["loc_name"] = df["Locality"].where(df["Price"].isna()).ffill()
# 过滤空值行、重命名列、调整列顺序
result = (
    df.dropna(subset=["Price"])
    .rename(columns={"loc_name": "Locality", "Locality": "Year"})
    [["Locality", "Year", "Price"]]
    .reset_index(drop=True)
)
# 可选:将年份、价格字段转为整数类型
result = result.astype({"Year": int, "Price": int})

# 打印输出结果验证
print(result)

输出验证

运行代码后得到的输出如下,和你需要的结构完全一致:

Locality  Year  Price
0     Loc1  2001    102
1     Loc1  2002    105
2     Loc2  2001    206
3     Loc2  2002    209
4     Loc3  2001    412
5     Loc3  2002    585

注:你给出的目标示例最后一行Loc3对应年份写为2001属于笔误,上述代码按原始数据的实际对应关系映射为2002年,如果确实需要调整可自行增加替换逻辑。

内容的提问来源于stack exchange,提问作者daidi06

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:15:11