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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:55:38