如何按客户筛选Pandas DataFrame,保留其最近3个月内的订单?
解决方案
你的第二个思路(按客户分组计算筛选起始日期再匹配)是完全可行的,问题出在代码细节的处理上,以下是修正后的完整操作步骤:
步骤1:转换日期列类型
首先必须将Order Date列转为datetime格式,否则无法进行日期运算:
import pandas as pd from pandas.tseries.offsets import DateOffset # 转换日期列(注意示例日期格式为DD-MM-YYYY,需指定format参数) df['Order Date'] = pd.to_datetime(df['Order Date'], format='%d-%m-%Y')
步骤2:计算每个客户的筛选起始日期
按Customer ID分组,取每个客户的最新订单日期,再减去3个月得到该客户的有效订单起始阈值:
# 分组计算每个客户的最近订单日期往前3个月的日期 customer_date_threshold = df.groupby('Customer ID')['Order Date'].max() - DateOffset(months=3) # 转为DataFrame格式,方便后续合并 customer_date_threshold = customer_date_threshold.reset_index(name='Last_purchase_3M')
步骤3:合并筛选阈值到原数据集
将计算好的起始日期合并回原DataFrame,让每条订单都能对应到所属客户的筛选标准:
df_merged = df.merge(customer_date_threshold, on='Customer ID', how='left')
步骤4:筛选符合条件的订单
直接对比订单日期与对应客户的起始阈值即可完成筛选,注意逻辑运算的优先级,需给每个比较条件单独加括号:
df_filtered = df_merged.loc[df_merged['Order Date'] >= df_merged['Last_purchase_3M']]
原代码报错原因说明
你之前的代码报错主要源于两个问题:
- 日期列未转为datetime类型,导致无法与
DateOffset进行运算 - 逻辑运算符
&的优先级高于比较运算符,未给比较条件加括号会导致类型不匹配错误
内容的提问来源于stack exchange,提问作者StephRas
相关产品推荐
相关产品推荐

