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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:05:26