Найти строку, связанную с максимальной датой после группового в Pandas - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть пандас DataFrame с 3 столбцами, содержащими PERSON_ID, MOVING_DATE AND PLACE следующим образом:

df = pandas.DataFrame(
[[1,datetime.datetime(2018, 1, 1), 'New York'], 
 [1, datetime.datetime(2018, 1, 20), 'Rio de Janeiro'],
 [1, datetime.datetime(2018, 2, 13), 'London'],
 [2, datetime.datetime(2017, 6, 12), 'Seatle'],
 [2, datetime.datetime(2016, 10, 10), 'New Mexico'],
 [3, datetime.datetime(2017, 9, 19), 'Sao Paulo'],
 [3, datetime.datetime(2015, 12, 11), 'Bangladesh']]],
columns=['PERSON ID', 'MOVING DATE', 'PLACE']
)

   PERSON ID MOVING DATE           PLACE
0          1  2018-01-01        New York
1          1  2018-01-20  Rio de Janeiro
2          1  2018-02-13          London
3          2  2017-06-12          Seatle
4          2  2016-10-10      New Mexico
5          3  2017-09-19       Sao Paulo
6          3  2015-12-11      Bangladesh

Я хотел бы найти место, где человек базируется на дате его последнего движения (MOVEMENT_DATE).

Можно ли получить результат методом groupby ?

Пока что я пробовал:

df = df.sort_values(['PERSON ID', 'MOVING DATE'])
df.groupby(['PERSON ID', 'MOVING DATE']).agg(
     {'MOVING DATE': max, 'PLACE': 'last'}
)

но это не сработало. Любая помощь будет оценена.

Заранее спасибо,

Rhenan

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Чтобы добавить к @Yuca и предоставленный ответ, вы также можете использовать функцию .max (), предоставляемую в библиотеке pandas, таким же образом, как и .last ().

больше: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.max.html

0 голосов
/ 09 ноября 2018

A sort здесь избыточно, это O(nlogn) сложность времени, когда вы можете сделать это с помощью loc и idxmax:

df.loc[df.groupby('PERSON ID')['MOVING DATE'].idxmax()]

   PERSON ID MOVING DATE      PLACE
2          1  2018-02-13     London
3          2  2017-06-12     Seatle
5          3  2017-09-19  Sao Paulo
0 голосов
/ 09 ноября 2018

Однострочник с использованием DataFrame.groupby и Grouper.last:

df.sort_values('MOVING DATE').groupby('PERSON ID').last()

выход:

     MOVING DATE      PLACE
PERSON ID                       
1          2018-02-13     London
2          2017-06-12     Seatle
3          2017-09-19  Sao Paulo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...