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

如何结合np.where与Pandas列,用前次交叉值填充至下次交叉触发

问题描述

我编写了如下代码:

df['cross'] = np.where((df['mean_close_spread'].shift(1) < 0) & (df['mean_close_spread'] > 0), 'cross', 'none')

df['cross_price'] = np.where((df['cross'] == 'cross'), df['close'], 'none')

这段代码生成的DataFrame如下:

closecrosscross_price
0.3434nonenone
0.3435nonenone
0.3433nonenone
0.3434cross0.3434
0.3433nonenone
0.3432nonenone
0.3431cross0.3431
0.4330nonenone

我希望当cross列值为none时,cross_price列不再填充none,而是用上一次cross对应的close值填充,直到下一次cross出现。期望的DataFrame如下:

closecrosscross_price
0.3434nonenone
0.3435nonenone
0.3433nonenone
0.3434cross0.3434
0.3433none0.3434
0.3432none0.3434
0.3431cross0.3431
0.4330none0.3431

解决方法

可以利用Pandas的缺失值填充功能实现需求,有两种简洁的实现方式:

方式一:基于原有代码修改

import numpy as np
import pandas as pd

# 保留原有的cross列生成逻辑
df['cross'] = np.where((df['mean_close_spread'].shift(1) < 0) & (df['mean_close_spread'] > 0), 'cross', 'none')
# 先生成初始的cross_price
df['cross_price'] = np.where((df['cross'] == 'cross'), df['close'], 'none')

# 替换+向前填充+还原开头的none
df['cross_price'] = df['cross_price'].replace('none', np.nan).ffill().replace(np.nan, 'none')

方式二:一步到位生成

直接在生成cross_price时使用缺失值,再做填充:

import numpy as np
import pandas as pd

df['cross'] = np.where((df['mean_close_spread'].shift(1) < 0) & (df['mean_close_spread'] > 0), 'cross', 'none')
# 生成cross_price时用NaN代替none
df['cross_price'] = np.where(df['cross'] == 'cross', df['close'], np.nan)
# 向前填充缺失值,再把开头无前置cross的NaN换回none
df['cross_price'] = df['cross_price'].ffill().replace(np.nan, 'none')

逻辑说明

  1. 替换为NaN:将字符串none转为Pandas可识别的缺失值NaN,这样才能使用填充方法。
  2. 向前填充(ffill):用最近的非缺失值填充后续的缺失值,正好实现“用上一次cross对应值填充直到下一次cross出现”的需求。
  3. 还原开头的none:将序列开头没有前置cross值的NaN换回none,与期望结果完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:45:31