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

如何用Python匹配订单与退货数据并标记对应行?

解决Pandas订单列表标记退货状态的问题

示例输入

订单数据集(orders)

import pandas as pd

orders = pd.DataFrame({
    "OrderNo": ["ORD001", "ORD002", "ORD003", "ORD004"],
    "Customer": ["Alice", "Bob", "Charlie", "David"],
    "Amount": [100, 200, 150, 300]
})

退货数据集(returns)

returns = pd.DataFrame({
    "OrderNo": ["ORD002", "ORD004"]
})

预期输出

OrderNoCustomerAmountReturned
ORD001Alice100
ORD002Bob200Y
ORD003Charlie150
ORD004David300Y

可行解决方案

方案1:isin() + numpy.where(简洁高效)

这是最直接的写法,先提取退货订单号的一维数组,再判断匹配:

import numpy as np

# 提取退货订单号的数组(避免DataFrame直接比较的歧义)
returned_nos = returns["OrderNo"].values

# 新增Returned列,匹配到则标记Y,否则留空
orders["Returned"] = np.where(orders["OrderNo"].isin(returned_nos), "Y", "")

方案2:左连接merge(适合复杂关联场景)

如果后续需要扩展退货相关的其他字段,用左连接更灵活:

# 给退货表先标记Y
returns["Returned"] = "Y"

# 左连接订单和退货表,按OrderNo匹配,空值填充为""
orders = orders.merge(returns, on="OrderNo", how="left").fillna({"Returned": ""})

常见错误排查

你之前用isin()失败大概率是这几个原因:

  • 直接传入整个returns DataFrame:必须指定returns["OrderNo"]或者提取values数组,否则会触发DataFrame和Series的无效比较
  • 没转换布尔结果:直接用orders["OrderNo"].isin(...)会得到True/False,需要用np.where或map转成Y/空
  • 订单号格式不一致:比如存在空格、大小写差异,先统一清洗:
    # 清洗订单号格式
    orders["OrderNo"] = orders["OrderNo"].str.strip().str.upper()
    returns["OrderNo"] = returns["OrderNo"].str.strip().str.upper()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:12:55