Python — Применить функцию для заполнения N / A в группах Group by

#python #pandas

#python #pandas

Вопрос:

У меня есть набор данных с отсутствующими значениями в 2 столбцах, и я хотел бы заполнить его значениями в предыдущих строках за последнюю предыдущую дату. Итак, существуют Weight и Height должны быть заполнены значениями из другой строки на основе последней даты для предопределенных Category и в отношении WorkerID (предопределенных в предыдущих заполненных строках), например:

Пример данных:

 Ind  Date       WorkerID  Category   Weight   Height   Kind_eat
1    31/12/17    E145-46     cat      2.35      0.6       1  
2    01/09/18    M147-50     cat      4.78      0.8       2
3    27/05/18    K178-56     dog      7.03      0.75      3
4    09/02/18    T106-20     mouse    NaN       NaN       1
5    18/03/19    M147-50     cat      NaN       NaN       2
6    25/03/19    K178-56     dog      NaN       NaN       3
7    04/01/17    T106-20     mouse    0.75      0.15      4
8    01/04/19    T156-10     dog      6.99      0.13      4
  

Итак, NaN Weight Height столбцы of и должны быть заполнены на основе Weight Height столбцов, относящихся к NaN значениям non на последнюю доступную дату, которая предшествует фактическому значению in Date .

Например,

 5    18/03/19    M147-50     cat      NaN       NaN       2
  

должно быть заполнено Weight и Height из line2 :

 5    18/03/19    M147-50     cat      4.78      0.8       2
  

Я пытался сделать это методом group-by и fillna для group , но он ничего не заполняет.

 df.groupby(['Date','WorkerID'], as_index = False).apply(lambda group: group.ffill())
  

также я пытался использовать:
df.groupby(['Date','WorkedID']).ffill().reindex(df.columns, axis=1)

Фактический результат: — нет правильного заполнения для NaN

 Ind  Date       WorkerID  Category   Weight   Height   Kind_eat
1    31/12/17    E145-46     cat      2.35      0.6       1  
2    01/09/18    M147-50     cat      4.78      0.8       2
3    27/05/18    K178-56     dog      7.03      0.75      3
4    09/02/18    T106-20     mouse    NaN       NaN       1
5    18/03/19    M147-50     cat      NaN       NaN       2
6    25/03/19    K178-56     dog      NaN       NaN       3
7    04/01/17    T106-20     mouse    0.75      0.15      4
8    01/04/19    T156-10     dog      6.99      0.13      4
  

Ожидаемый результат должен быть:

 Ind  Date       WorkerID  Category   Weight   Height   Kind_eat
1    31/12/17    E145-46     cat      2.35      0.6       1  
2    01/09/18    M147-50     cat      4.78      0.8       2
3    27/05/18    K178-56     dog      7.03      0.75      3
4    09/02/18    T106-20     mouse    0.75      0.15      1
5    18/03/19    M147-50     cat      4.78      0.8       2
6    25/03/19    K178-56     dog      7.03      0.75      3
7    04/01/17    T106-20     mouse    0.75      0.15      4
8    01/04/19    T156-10     dog      6.99      0.13      4
  

Я был бы признателен за любую идею. Спасибо)

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

1. Я думаю, что вы line2 описали все так, как 5 18/03/19 M147-50 cat 4.78 0.8 2 должно быть 2 01/09/18 M147-50 cat 4.78 0.8 2 , я прав?

2. @SzymonMaszke, нет, дата должна быть сохранена как в строке 5: 18/03/19 , только NAN из Weight и Height столбцы должны быть заменены из строки 2.

3. Да, именно это я и имел в виду, хотя это выглядит немного запутанно, спасибо за разъяснение

4. @SzymonMaszke, вот почему у меня нет никакой новой идеи о том, как это можно исправить.

5. @Cindy не могли бы вы попробовать: df.sort_values(‘Дата’). fillna(метод=’ffill’).sort_values(‘Ind’)

Ответ №1:

Я думаю, вам нужно сначала преобразовать Date datetime в.

 df['Date'] = pd.to_datetime(df['Date'])
  

И использовать sort_values by Date и groupby с ['WorkerID', 'Category'] then ffill .

 df = df.sort_values('Date').groupby(['WorkerID', 'Category']).ffill().sort_index()

df
    WorkerID Category       Date  Weight  Height  Kind_eat
Ind                                                       
1    E145-46      cat 2017-12-31    2.35    0.60         1
2    M147-50      cat 2018-01-09    4.78    0.80         2
3    K178-56      dog 2018-05-27    7.03    0.75         3
4    T106-20    mouse 2018-09-02    0.75    0.15         1
5    M147-50      cat 2019-03-18    4.78    0.80         2
6    K178-56      dog 2019-03-25    7.03    0.75         3
7    T106-20    mouse 2017-04-01    0.75    0.15         4
8    T156-10      dog 2019-01-04    6.99    0.13         4