【问题标题】:fillna with last non nan value based on a condition根据条件填充最后一个非 nan 值
【发布时间】:2022-01-22 11:42:01
【问题描述】:

我有一个带有以下列的 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

【问题讨论】:

    标签: python python-3.x pandas numpy


    【解决方案1】:

    您可以根据相反的条件将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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 2019-07-04
      • 2021-01-09
      • 2021-01-24
      • 2020-10-20
      • 1970-01-01
      • 2017-06-29
      相关资源
      最近更新 更多