如何结合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如下:
| close | cross | cross_price |
|---|---|---|
| 0.3434 | none | none |
| 0.3435 | none | none |
| 0.3433 | none | none |
| 0.3434 | cross | 0.3434 |
| 0.3433 | none | none |
| 0.3432 | none | none |
| 0.3431 | cross | 0.3431 |
| 0.4330 | none | none |
我希望当cross列值为none时,cross_price列不再填充none,而是用上一次cross对应的close值填充,直到下一次cross出现。期望的DataFrame如下:
| close | cross | cross_price |
|---|---|---|
| 0.3434 | none | none |
| 0.3435 | none | none |
| 0.3433 | none | none |
| 0.3434 | cross | 0.3434 |
| 0.3433 | none | 0.3434 |
| 0.3432 | none | 0.3434 |
| 0.3431 | cross | 0.3431 |
| 0.4330 | none | 0.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')
逻辑说明
- 替换为NaN:将字符串
none转为Pandas可识别的缺失值NaN,这样才能使用填充方法。 - 向前填充(ffill):用最近的非缺失值填充后续的缺失值,正好实现“用上一次cross对应值填充直到下一次cross出现”的需求。
- 还原开头的none:将序列开头没有前置cross值的
NaN换回none,与期望结果完全匹配。
内容的提问来源于stack exchange,提问作者Jack Mahon
相关产品推荐
相关产品推荐

