具有基于条件的最后一个非nan值的fillna



我有一个pandas数据帧,包含以下列

open        high         low       close
0    66069.69    66151.73    65932.01    65998.30   
1    65998.29    65998.30    65702.43    65836.37   
2    65836.38    66000.00    65814.63    65924.44   
3    65924.43    66065.78    65864.82    66021.54   
4    66021.55    66084.32    65800.00    65801.19   
5    65805.00    65886.41    65750.00    65797.19

想要使用逻辑创建两个新列

if open<close:
+HL = (high-low)
-HL = the last  -HL value if it exist else nan
else:
+HL = the last +HL value if it exist else nan
-HL = (high-low)

新的df应该是这样的。

open        high         low       close      +HL       -HL
0    66069.69    66151.73    65932.01    65998.30      nan    219.72
1    65998.29    65998.30    65702.43    65836.37      nan    295.87
2    65836.38    66000.00    65814.63    65924.44   185.37    295.87
3    65924.43    66065.78    65864.82    66021.54   200.96    295.87
4    66021.55    66084.32    65800.00    65801.19   200.96    284.32
5    65805.00    65886.41    65750.00    65797.19   200.96    136.41

您可以根据相反的条件将high - low分配给两个不同的列,然后向前填充:

df['+HL'] = np.where(df['open'] < df['close'], df['high'] - df['low'], np.nan)
df['-HL'] = np.where(df['open'] >= df['close'], df['high'] - df['low'], np.nan)
df = df.ffill()

输出:

>>> df
open      high       low     close     +HL     -HL
0  66069.69  66151.73  65932.01  65998.30     NaN  219.72
1  65998.29  65998.30  65702.43  65836.37     NaN  295.87
2  65836.38  66000.00  65814.63  65924.44  185.37  295.87
3  65924.43  66065.78  65864.82  66021.54  200.96  295.87
4  66021.55  66084.32  65800.00  65801.19  200.96  284.32
5  65805.00  65886.41  65750.00  65797.19  200.96  136.41

最新更新