Python - заполнить NA значением из предыдущих строк на основе столбца идентификатора - PullRequest
0 голосов
/ 27 марта 2019

Я хотел бы заполнить пропущенное значение в 2 столбцах.Есть Date и Cat2 должны быть заполнены значением другой строки на основе последней даты для предопределенного Cat1 (предопределенного в предыдущих заполненных строках), например:

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

Day  Date      Cat1      Cat2
1    31/12/17  cat       mouse
2    01/09/18  cat       mouse
3    27/05/18  dog       elephant
4       NaN    cat       NaN
5       NaN    cat       NaN

Таким образом, столбец NaN из Date должен быть заполнен на основе последней существующей даты для значений cat из столбца Cat1 - 01/09/18.Столбец NaN in Cat2 должен быть заполнен на mouse как определенные значения в строке, которая уже выбрана для Date - 01/09/18.

Я читал, что циклически проходить по каждой строке было бы очень плохой практикой, и что было бы лучше сделать все одним способом.

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

Я пытался сделать это методом fillna, но он заполняется последними значениями без условия для Cat1.

data.fillna(method='ffill', inplace = True)

Фактический результат:

Day  Date      Cat1      Cat2
1    31/12/17  cat       mouse
2    01/09/18  cat       mouse
3    27/05/18  dog       elephant
4    27/05/18  cat       elephant
5    27/05/18  cat       elephant

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

Day  Date      Cat1      Cat2
1    31/12/17  cat       mouse
2    01/09/18  cat       mouse
3    27/05/18  dog       elephant
4    01/09/18  cat       mouse
5    01/09/18  cat       mouse

Ответы [ 3 ]

1 голос
/ 27 марта 2019

Я считаю, что вам нужно GroupBy.ffill с DataFrame.reindex для того же заказа, что и оригинал DataFrame:

df = df.groupby('Cat1').ffill().reindex(df.columns, axis=1)
print (df)
   Day      Date Cat1      Cat2
0    1  31/12/17  cat     mouse
1    2  01/09/18  cat     mouse
2    3  27/05/18  dog  elephant
3    4  01/09/18  cat     mouse
4    5  01/09/18  cat     mouse
0 голосов
/ 17 июля 2019

Вы можете использовать диктовку:

dict = df[['cat','cat2']].drop_duplicates(keep='first', inplace=False).to_dict()
df['cat2'] = df['cat1'].replace(dict)

для столбца timeseries вы можете использовать timedelta (линейная экстраполяция). удачи!

0 голосов
/ 27 марта 2019

Также альтернативный способ:

data = data.groupby(['Cat1'], as_index = False).apply(lambda group: group.ffill())

Спасибо, @Jezrael за идею решения :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...