如何使用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
相关产品推荐
相关产品推荐

