группировать строки с одинаковым идентификатором, панды / питона - PullRequest
2 голосов
/ 01 октября 2019

Вот исходный набор данных

id         firstname    lastname      email               update date
A1         wendy         smith         ws@mail.com        2018-01-02
A1         wendy         smith         smith@mail.com     2019-02-03 
A2         harry         lynn          lynn@mail.com      2016-04-03
A2         harry                       harylynn@mail.com  2019-03-12
A3         tinna         dickey        tinna@mail.com      2016-04-03
A3         tinna         dickey        776-3384-333       2019-03-12

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

id         firstname    lastname      email               update date
A1         wendy         smith         smith@mail.com     2019-02-03 
A2         harry         lynn          harylynn@mail.com  2019-03-12
A3         tinna         dickey        tinna@mail.com      2019-03-12

В настоящее время я пытаюсь использовать pandas groupby для группировки ячеек с одинаковым значением и сохранения разных значений в одной ячейке, разделенных символом «,» для последующего использования (удалить ранееданные, сделать одну ячейку одной данных). Но я думаю, что то, что я делаю, не правильно ...

df=df.groupby(['id']).agg({'first_name': lambda x:','.join(set(x))})

Что, если последнее значение является неправильным, нужно ли сохранять значение конфликта в новом столбце для последующей очистки?

Любая помощь будет оценена!

Ответы [ 2 ]

2 голосов
/ 01 октября 2019

Если ваш столбец update_date отсортирован по возрастанию. И ваши пустые ячейки являются фактическими пробелами, используйте replace, ffill и drop_duplicates

df_new = df.replace('', np.NaN).ffill().drop_duplicates('id', keep='last')

Если ваши пустые ячейки NaN, используйте:

df_new = df.ffill().drop_duplicates('id', keep='last')

Вывод

   id firstname lastname              email update date
1  A1     wendy    smith     smith@mail.com  2019-02-03
3  A2     harry     lynn  harylynn@mail.com  2019-03-12

Если ваши данные не отсортированы, сначала выполните:

df = df.sort_values(['id', 'update date'])
1 голос
/ 01 октября 2019

Я думаю, что это решит

output = df.drop_duplicates(subset=["id"], keep='last')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...