在熊猫中的groupby之后找到与最大日期关联的行

时间:2018-11-09 19:37:50

标签: python pandas pandas-groupby

我有一个带有3列的pandas DataFrame,其中包含PERSON_ID,MOVING_DATE和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'}
)

但是没有成功。 任何帮助将不胜感激。

预先感谢

河南

3 个答案:

答案 0 :(得分:8)

使用DataFrame.groupbyGrouper.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

答案 1 :(得分:3)

<div class="navbar"> <div class="nav-links"> <a class="active" href="#home">Home</a> <a herf="#about">About </a> <a herf="#patientinfo"> Patient Information </a> <div class="dropdown"> <button class = "dropbutton">Select Hospital </button> <div class= "dropdown-content"> <a href="#">Hospital</a> <a href="#">Hospital</a> <a href="#">Hospital</a> <a href="#">Hospital</a> </div> </div> </div> <div class="search"> <form action="/action_page.php"> <!--backend --> <input class="search-input" type="text" name="search" placeholder="Search"> <button class="search-button" type="submit">Submit</button> </form> <!--search bar --> </div> </div>在这里是过大的,这是sort的时间复杂性,当您可以使用O(nlogn)loc来做到这一点时:

idxmax

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

答案 2 :(得分:1)

要添加到@Yuca和提供的答案,您还可以按照添加.last()的相同方式利用pandas lib中提供的.max()函数。

更多:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.max.html