【问题标题】:Pandas - Numpy.Where referencing previous row valuePandas - Numpy.Where 引用前一行值
【发布时间】:2023-03-24 16:04:01
【问题描述】:

我有以下数据框:

         date Price_C_1  OI_C_1
0  2021-03-05    549.75   37442
1  2021-03-08    549.75   37739
2  2021-03-09     542.5   37448
3  2021-03-10     537.0   39707
4  2021-03-11     551.0   39136
..        ...       ...     ...
95 2021-07-19     562.5  188911
96 2021-07-20    562.25  186953
97 2021-07-21    585.25  176430
98 2021-07-22     592.5       0
99 2021-07-23    597.75       0

我想将 OI_C_1 中的“0”值替换为之前的非 0 值。

我试过了:

data['OI_C_1'] = np.where(data['OI_C_1']==0, data['OI_C_1'].shift(), data['OI_C_1']  )

但我明白了:

         date Price_C_1  OI_C_1
0  2021-03-05    549.75   37442
1  2021-03-08    549.75   37739
2  2021-03-09     542.5   37448
3  2021-03-10     537.0   39707
4  2021-03-11     551.0   39136
..        ...       ...     ...
95 2021-07-19     562.5  188911
96 2021-07-20    562.25  186953
97 2021-07-21    585.25  176430
98 2021-07-22     592.5  176430
99 2021-07-23    597.75       0

所以还有一个“0”值。

有没有办法强制 np.where 从顶部开始一次运行一行? 谢谢

【问题讨论】:

  • 使用np.where 作为记录,而不是你希望它工作。它不是一个迭代器。这是一个 python 函数,需要 3 个数组,并返回一个(或此处为 3 系列)。

标签: python python-3.x pandas dataframe numpy


【解决方案1】:

您可以ffill 而不是逐行迭代。使用wheremask 对0 进行NaN。

df['OI_C_1'] = df['OI_C_1'].mask(df['OI_C_1'].eq(0)).ffill(downcast='infer')

          date  Price_C_1  OI_C_1
0   2021-03-05     549.75   37442
1   2021-03-08     549.75   37739
2   2021-03-09     542.50   37448
3   2021-03-10     537.00   39707
4   2021-03-11     551.00   39136
95  2021-07-19     562.50  188911
96  2021-07-20     562.25  186953
97  2021-07-21     585.25  176430
98  2021-07-22     592.50  176430
99  2021-07-23     597.75  176430

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 2018-06-15
    • 2015-05-07
    • 2022-11-12
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    相关资源
    最近更新 更多