#python #python-3.x #pandas #dataframe #numpy
Вопрос:
У меня есть следующий фрейм данных:
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
Я хочу заменить значения «0» в OI_C_1 предыдущим значением, отличным от 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.где запускать по одной строке за раз, начиная сверху? Спасибо
Комментарии:
1. Используйте
np.where
так, как задокументировано, а не так, как вы надеетесь, что это сработает. Это не итератор. Это функция python, которая принимает 3 массива и возвращает один (или здесь 3 ряда).
Ответ №1:
Вместо того, чтобы итеративно переходить от строки к строке, вы можете ffill
. where
mask
Используйте или для установки нулей.
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