求助:如何在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'])
期望结果
| Variable | Status | Carried_Value | |
|---|---|---|---|
| 0 | 10 | -1 | 10 |
| 1 | 20 | 1 | 20 |
| 2 | 30 | -1 | 30 |
| 3 | 40 | -1 | 30 |
| 4 | 50 | -1 | 30 |
| 5 | 22 | 1 | 22 |
| 6 | 60 | 1 | 22 |
| 7 | 70 | 1 | 22 |
| 8 | 100 | 1 | 22 |
尝试过的代码
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
相关产品推荐
相关产品推荐

