Python爬虫数据格式转换:将多店铺列数据转为分行结构
用Python Pandas实现宽表转长表(多店铺列转单店铺行)
直接用Pandas就能快速搞定这个格式转换,核心思路是把每个店铺对应的列组(store_xx、price_xx、shipping_xx)拆成单独的行,重复产品的基础信息。
具体步骤与代码示例
假设你的输入CSV结构大概是这样(示例):
product_name,product_weight,store_1,price_1,shipping_1,store_2,price_2,shipping_2 Ziwi Peak Beef 1kg,1kg,Pets Warehouse,39.99,5.99,Pet Supplies Online,38.99,4.99 Ziwi Peak Lamb 2.5kg,2.5kg,Pet City,79.99,Free,NaN,NaN,NaN
1. 导入依赖并读取CSV
import pandas as pd # 读取原始CSV df = pd.read_csv("ziwi_peak_raw.csv")
2. 提取店铺编号并拆分列组
先找出所有带数字后缀的店铺相关列,然后按编号分组处理:
# 提取所有店铺列的后缀数字(比如从store_1里拿到1) store_numbers = sorted(list(set(col.split("_")[-1] for col in df.columns if "_" in col))) # 初始化空列表存转换后的数据 result_rows = [] # 遍历每个店铺编号 for num in store_numbers: # 拆分产品基础列(不带下划线的列)和当前店铺的专属列 product_cols = [col for col in df.columns if "_" not in col] store_cols = [col for col in df.columns if col.endswith(f"_{num}")] # 拼接列生成临时DataFrame temp_df = df[product_cols + store_cols].copy() # 重命名店铺相关列,统一去掉后缀 temp_df.rename(columns={ f"store_{num}": "store", f"price_{num}": "price", f"shipping_{num}": "shipping" }, inplace=True) # 过滤掉当前店铺无数据的行(比如空值行) temp_df = temp_df.dropna(subset=["store"]) # 把临时数据加入结果列表 result_rows.append(temp_df) # 合并所有临时表得到最终结果 final_df = pd.concat(result_rows, ignore_index=True)
3. 保存转换后的CSV
final_df.to_csv("ziwi_peak_cleaned.csv", index=False)
输出结果示例
转换后的CSV会变成每行对应一个产品+店铺的结构:
product_name,product_weight,store,price,shipping Ziwi Peak Beef 1kg,1kg,Pets Warehouse,39.99,5.99 Ziwi Peak Beef 1kg,1kg,Pet Supplies Online,38.99,4.99 Ziwi Peak Lamb 2.5kg,2.5kg,Pet City,79.99,Free
灵活调整说明
- 如果原始CSV还有其他店铺相关列(比如
stock_xx),只需在重命名步骤里添加对应的映射规则即可 - 要是店铺后缀不是数字(比如
store_a、store_b),修改提取后缀的逻辑,直接取_后面的字符串就行
内容的提问来源于stack exchange,提问作者X-something
相关产品推荐
相关产品推荐

