Pandas групповое преобразование для получения ненулевого значения даты - PullRequest
3 голосов
/ 29 февраля 2020

У меня есть датафрейм, сконструированный так:

df = pd.DataFrame({'id': [1,2,3,4,1,2,3,4],
                   'birthdate': ['01-01-01','02-02-02','03-03-03','04-04-04',
                                 '','02-02-02','03-04-04','04-03-04']})
df['birthdate'] = pd.to_datetime(df['birthdate'])

Я хочу сделать групповую операцию, чтобы изменить исходные данные, используя pandas .transform

Условие, что я хочу чтобы выбрать birthdate значение первой ненулевой строки для id

Я знаю, что могу сделать max, если нет другой опции, чтобы избавиться от ненулевых записей, но если есть несоответствия, я не обязательно хочу максимальную дату, только ту, которая появляется первой в кадре данных.

Таким образом:

df['birthdate'] = df.groupby('id')['birthdate'].transform(max)

Вот так выглядит вывод, используя max:

id  birthdate
0   1 2001-01-01
1   2 2002-02-02
2   3 2003-03-03
3   4 2004-04-04
4   1 2001-01-01
5   2 2002-02-02
6   3 2004-03-04
7   4 2004-04-04

Вот как я на самом деле хочу, чтобы это выглядело:

id  birthdate
0   1 2001-01-01
1   2 2002-02-02
2   3 2003-03-03
3   4 2004-04-04
4   1 2001-01-01
5   2 2002-02-02
6   3 2003-03-03
7   4 2004-04-04

Я почти уверен, что мне нужно создать клиента lambda, чтобы поместить его в .transform, но Я не уверен, какое условие использовать.

1 Ответ

2 голосов
/ 29 февраля 2020

Вы можете попробовать следующее. Ваше определение кадра данных и предлагаемые выходные данные содержат разные даты, поэтому я предположил, что ваше определение информационного кадра было правильным

df['birthdate'] = df.groupby('id').transform('first')

, которое выводит.

   id   birthdate
0   1   2001-01-01
1   2   2002-02-02
2   3   2003-03-03
3   4   2004-04-04
4   1   2001-01-01
5   2   2002-02-02
6   3   2003-03-03
7   4   2004-04-04
...