如何用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
关键步骤解释
- 获取前序RM值:用
df['RM'].shift(1)把RM列整体向下移动一行,这样每一行就能拿到上一行的RM值,第一行因为没有前序值会变成NaN。 - 处理第一行的NaN:用
fillna(-np.inf)把第一行的NaN替换成负无穷,这样第一行的A值(384)肯定大于负无穷,满足A > 前序RM的条件,Status会被设为0,完全符合你的期望。 - 条件判断赋值:
numpy.where()会根据第一个布尔条件的结果,把满足条件的行设为0,不满足的设为1,完美匹配你的需求规则。
你之前可能踩的坑
如果直接用df['A'] > df['RM'].shift(1)做条件,第一行的比较结果是NaN,numpy.where()会把NaN视为不满足条件,导致第一行Status变成1,和预期不符。所以填充NaN是关键的修正步骤。
内容的提问来源于stack exchange,提问作者mysticBliss
相关产品推荐
相关产品推荐

