Панды — Тупицы.Где ссылка на предыдущее значение строки

#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