Pandas条件移位需求:计算客户最近获胜日期
求助:Pandas中的条件移位实现
我有如下DataFrame:
rng = pd.date_range('2015-02-24', periods=10, freq='D') win_list = ['Won', 'Lost', 'Won', 'Won', 'Lost', 'Won', 'Lost', 'Lost', 'Lost', 'Won'] cust_list = ['A', 'A', 'B', 'C', 'C', 'C', 'B', 'A', 'A', 'B'] output = ['2015-02-24', '2015-02-24', '2015-02-26', '2015-02-27', '2015-02-27', '2015-03-01', '2015-02-26', '2015-02-24', '2015-02-24', '2015-03-05'] df = pd.DataFrame({'TodayDate': rng, 'Status': win_list, 'Customer': cust_list, 'Last Win Datetime' : output}) df
其展示如下:
TodayDate Status Customer Last Win Datetime 2015-02-24 Won A 2015-02-24 2015-02-25 Lost A 2015-02-24 2015-02-26 Won B 2015-02-26 2015-02-27 Won C 2015-02-27 2015-02-28 Lost C 2015-02-27 2015-03-01 Won C 2015-03-01 2015-03-02 Lost B 2015-02-26 2015-03-03 Lost A 2015-02-24 2015-03-04 Lost A 2015-02-24 2015-03-05 Won B 2015-03-05
我需要计算“Last Win Datetime”列,该列需返回对应客户最近一次Status为Won的TodayDate。
我曾尝试过Stack Overflow上的相关方案,但该方案仅返回匹配Status的最近日期,不符合我的需求。
解决方案
可以通过分组+条件过滤+向前填充的方式实现需求,步骤如下:
- 先按客户分组,确保每组内数据按时间顺序排列
- 仅保留每组中
Status='Won'对应的日期,其余位置用空值填充 - 对每组的空值进行向前填充,得到每行对应的最近获胜日期
高效实现代码:
# 按客户和日期排序,保证时间顺序正确 df_sorted = df.sort_values(['Customer', 'TodayDate']) # 分组后仅保留获胜日期,再向前填充 df_sorted['Last Win Datetime'] = df_sorted.groupby('Customer')['TodayDate'].where(df_sorted['Status'] == 'Won').ffill() # 恢复原数据的索引顺序(可选) df = df_sorted.sort_index() # 查看结果 print(df[['TodayDate', 'Status', 'Customer', 'Last Win Datetime']])
执行后即可得到与示例中一致的Last Win Datetime列,每个客户的每一行都会显示其截至当前日期最近的一次获胜日期。
内容的提问来源于stack exchange,提问作者idealunique
相关产品推荐
相关产品推荐

