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

高级字符串拆分:如何从商品订单字符串中分离商品与对应价格

解决方案

问题说明

CSV中basket_items字段的结构规则:

  • 整单商品用英文逗号分隔
  • 单个商品用-作为分隔符,最后一段固定为价格,存在口味的商品会在商品名和价格之间多一段口味值
    原代码仅完成了整单维度的逗号拆分,未对单个商品做字段拆解、格式转换,无法直接得到商品与价格的匹配关系。

给出的CSV样例数据结构:

timestamp,store,customer_name,basket_items,total_price,cash_or_card
06/06/2022 09:00,Chesterfield,Stephanie Neyhart,"Large Flat white - 2.45, Large Flavoured iced latte - Vanilla - 3.25, Large Flavoured iced latte - Hazelnut - 3.25",8.95,CASH
06/06/2022 09:02,Chesterfield,Donna Marley,"Large Flavoured iced latte - Hazelnut - 3.25, Regular Latte - 2.15, Large Flavoured iced latte - Vanilla - 3.25",8.65,CARD

实现代码

版本1:按订单维度输出结构化商品列表

处理后每笔订单对应一个字典,包含订单基础信息和结构化的商品明细,商品字段区分商品名、口味、价格:

import pandas as pd

# 读取并清洗数据
df = pd.read_csv("team1-project/example_transactions.csv")
df = df.dropna().reset_index(drop=True)

order_list = []
for _, row in df.iterrows():
    # 拆分整单为单个商品,去除前后多余空格
    raw_goods = [item.strip() for item in row["basket_items"].split(",")]
    goods_detail = []
    for good in raw_goods:
        parts = [p.strip() for p in good.split(" - ")]
        price = float(parts[-1])
        if len(parts) == 3:
            # 带口味的商品
            goods_detail.append({
                "base_name": parts[0],
                "flavor": parts[1],
                "full_name": f"{parts[0]} - {parts[1]}",
                "price": price
            })
        elif len(parts) == 2:
            # 无口味商品
            goods_detail.append({
                "base_name": parts[0],
                "flavor": None,
                "full_name": parts[0],
                "price": price
            })
    order_list.append({
        "timestamp": row["timestamp"],
        "store": row["store"],
        "customer": row["customer_name"],
        "pay_type": row["cash_or_card"],
        "total": float(row["total_price"]),
        "goods": goods_detail
    })

版本2:打平为商品明细DataFrame

如果后续需要做销量、销售额统计,直接打平为单商品一行的表结构更方便:

item_records = []
for _, row in df.iterrows():
    raw_goods = [item.strip() for item in row["basket_items"].split(",")]
    for good in raw_goods:
        parts = [p.strip() for p in good.split(" - ")]
        record = {
            "timestamp": row["timestamp"],
            "store": row["store"],
            "price": float(parts[-1])
        }
        if len(parts) == 3:
            record["base_name"] = parts[0]
            record["flavor"] = parts[1]
        else:
            record["base_name"] = parts[0]
            record["flavor"] = None
        item_records.append(record)

# 转为DataFrame可直接做分组统计
item_df = pd.DataFrame(item_records)

处理效果

单个商品结构化后的结果示例:

{
  "base_name": "Large Flavoured iced latte",
  "flavor": "Hazelnut",
  "full_name": "Large Flavoured iced latte - Hazelnut",
  "price": 3.25
}

可以直接通过full_name作为唯一键匹配对应价格,也可以通过base_name+flavor的组合做商品去重、分类统计。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 05:12:16