Быстрый способ заполнить NaN в DataFrame

#python #pandas

#python #панды

Вопрос:

У меня есть DataFrame объект df с таким столбцом:

 [In]: df
[Out]:
                 id            sum
0                 1            NaN
1                 1            NaN
2                 1              2
3                 1            NaN
4                 1              4
5                 1            NaN
6                 2            NaN
7                 2            NaN
8                 2              3
9                 2            NaN
10                2              8
10                2            NaN
...             ...            ...
[1810601 rows x 2 columns]
  

NaN В моем столбце много значений, и я хочу заполнить их следующим образом:

  • если NaN находится в начале (для first index per id equals 0 ), то оно должно быть 0
  • иначе, если NaN я хочу взять значение из предыдущего индекса для того же id

Вывод должен быть таким:

 [In]: df
[Out]:
                 id            sum
0                 1              0
1                 1              0
2                 1              2
3                 1              2
4                 1              4
5                 1              4
6                 2              0
7                 2              0
8                 2              3
9                 2              3
10                2              8
10                2              8
...             ...            ...
[1810601 rows x 2 columns]
  

Я пытался сделать это «шаг за шагом», используя цикл with iterrows() , но это очень неэффективный метод. Я считаю, что это можно сделать быстрее с помощью методов pandas

Комментарии:

1. У Pandas есть функция для этого! Взгляните на pandas.DataFrame.fillna .

2. Но как я могу использовать pandas.DataFrame.fillna для этого конкретного условия?

3. @Justin fillna не будет поддерживать условное заполнение

Ответ №1:

Попробуйте ffill, как предложено с помощью groupby

 df['sum'] = df.groupby('id')['sum'].ffill().fillna(0)