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

求助:如何在Pandas中基于Status变化追踪Carried_Value

问题:追踪特定条件下变化的数值

需求说明

需要为包含Variable和Status字段的DataFrame生成Carried_Value字段,规则是:仅当Status发生变化时,更新该字段的数值;若Status未变化,则保持上一次更新后的值。此前尝试用np.select结合shift方法仅首次生效,后续无法持续携带目标值;循环迭代也未解决问题。

测试数据

Variable = [10,20,30,40,50,22, 60,70,100]
Status = [-1,1,-1,-1,-1,1,1,1,1]
zipped = list(zip(Variable, Status))
df = pd.DataFrame(zipped, columns=['Variable', 'Status'])

期望结果

VariableStatusCarried_Value
010-110
120120
230-130
340-130
450-130
522122
660122
770122
8100122

尝试过的代码

col = 'Status'
conditions = [(df[col] == 1) & (df[col].shift(1) == -1), 
             (df[col] == -1) & (df[col].shift(1) == 1), 
             (df[col] == 1) & (df[col].shift(1) == 1), 
             (df[col] == -1) & (df[col].shift(1) == -1)]
choices = [df['Variable'], df['Variable'], df['Variable'].shift(1), df['Variable'].shift(1)]
df['Carried_Value'] = np.select(conditions, choices, default = 0)

解决方案

核心思路是先标记Status发生变化的位置,仅在这些位置保留Variable值,其余位置用向前填充(ffill)延续最近的有效数值:

# 标记Status变化的行(第一行默认算变化)
df['status_change'] = df['Status'].ne(df['Status'].shift(1)).fillna(True)
# 仅在变化行保留Variable值,其余设为NaN
df['Carried_Value'] = df['Variable'].where(df['status_change'])
# 向前填充NaN,得到持续携带的数值
df['Carried_Value'] = df['Carried_Value'].ffill()
# 可选:删除辅助列
df = df.drop('status_change', axis=1)

原方法失效的原因是shift(1)只能取前一行的原始Variable值,无法追踪已经更新后的Carried_Value;而ffill()会自动延续最近的有效数值,完美解决持续携带的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:02:44