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

Python中过滤DataFrame:保留含婴童类商品的整单交易

保留含特定商品的完整订单过滤方案

问题场景

现有包含INVOICE_DATE、COUNTRY、CUSTOMER_ID、INVOICE_ID、DESCRIPTION、USIM、DEMANDQTY列的DataFrame,需实现:若某订单(同一INVOICE_ID)内存在DESCRIPTION包含"kids"或"baby"的商品,则保留该订单的所有行。

原代码仅过滤出符合描述条件的单行,无法保留整单:

import pandas as pd

# 假设DataFrame名为'df'
filtered_df = df[df['DESCRIPTION'].str.contains('kids|baby', case=False, regex=True)]

解决方案

核心思路:先定位所有包含目标商品的订单ID,再基于这些ID筛选整个订单的所有行。

简化版实现代码

直接合并步骤,无需临时列:

import pandas as pd

# 提取所有含目标商品的订单ID,再过滤整单
filtered_df = df[df['INVOICE_ID'].isin(
    df[df['DESCRIPTION'].str.contains('kids|baby', case=False)]['INVOICE_ID'].unique()
)]

分步解释(便于理解)

如果需要拆解逻辑,可按以下步骤执行:

  1. 标记每行是否为目标商品
df['is_target'] = df['DESCRIPTION'].str.contains('kids|baby', case=False, regex=True)
  1. 筛选出至少包含一个目标商品的订单ID
valid_invoice_ids = df.groupby('INVOICE_ID')['is_target'].any()
valid_invoice_ids = valid_invoice_ids[valid_invoice_ids].index.tolist()
  1. 过滤出完整订单并清理临时列
filtered_df = df[df['INVOICE_ID'].isin(valid_invoice_ids)].drop('is_target', axis=1)

验证测试

使用你提供的测试数据生成代码创建df后,运行上述代码即可得到符合要求的结果。例如,查看某一完整订单的所有行:

# 输出第一个符合条件的订单全部内容
print(filtered_df[filtered_df['INVOICE_ID'] == filtered_df['INVOICE_ID'].iloc[0]])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:37:17