如何用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"] })
预期输出
| OrderNo | Customer | Amount | Returned |
|---|---|---|---|
| ORD001 | Alice | 100 | |
| ORD002 | Bob | 200 | Y |
| ORD003 | Charlie | 150 | |
| ORD004 | David | 300 | Y |
可行解决方案
方案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()失败大概率是这几个原因:
- 直接传入整个
returnsDataFrame:必须指定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
相关产品推荐
相关产品推荐

