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

如何用Pandas基于前序RM值结合shift生成Status列?

解决Pandas中基于前序RM值生成Status列的问题

你提到的思路完全正确——结合shift()和numpy.where()确实是实现这个需求的高效方式,大概率是没处理好第一行的NaN值导致结果不符合预期。我来帮你梳理一下正确的实现步骤:

完整代码实现

import pandas as pd
import numpy as np

# 先构造你提供的示例DataFrame
data = {
    'A': [384, 376, 399, 333, 393, 323, 510, 426, 352],
    'RM': [np.nan, 380.0, 387.5, 366.0, 363.0, 358.0, 416.5, 468.0, 389.0]
}
df = pd.DataFrame(data)

# 生成Status列
df['Status'] = np.where(
    df['A'] > df['RM'].shift(1).fillna(-np.inf),
    0,
    1
)

print(df)

运行后会输出你期望的结果:

A     RM  Status
0  384    NaN       0
1  376  380.0       1
2  399  387.5       0
3  333  366.0       1
4  393  363.0       0
5  323  358.0       1
6  510  416.5       0
7  426  468.0       0
8  352  389.0       1

关键步骤解释

  1. 获取前序RM值:用df['RM'].shift(1)把RM列整体向下移动一行,这样每一行就能拿到上一行的RM值,第一行因为没有前序值会变成NaN。
  2. 处理第一行的NaN:用fillna(-np.inf)把第一行的NaN替换成负无穷,这样第一行的A值(384)肯定大于负无穷,满足A > 前序RM的条件,Status会被设为0,完全符合你的期望。
  3. 条件判断赋值:numpy.where()会根据第一个布尔条件的结果,把满足条件的行设为0,不满足的设为1,完美匹配你的需求规则。

你之前可能踩的坑

如果直接用df['A'] > df['RM'].shift(1)做条件,第一行的比较结果是NaN,numpy.where()会把NaN视为不满足条件,导致第一行Status变成1,和预期不符。所以填充NaN是关键的修正步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:08:12