#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