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() )]
分步解释(便于理解)
如果需要拆解逻辑,可按以下步骤执行:
- 标记每行是否为目标商品
df['is_target'] = df['DESCRIPTION'].str.contains('kids|baby', case=False, regex=True)
- 筛选出至少包含一个目标商品的订单ID
valid_invoice_ids = df.groupby('INVOICE_ID')['is_target'].any() valid_invoice_ids = valid_invoice_ids[valid_invoice_ids].index.tolist()
- 过滤出完整订单并清理临时列
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
相关产品推荐
相关产品推荐

