【问题标题】:Find the row associated with maximum date after groupby in Pandas在 Pandas 中查找 groupby 之后与最大日期相关的行
【发布时间】:2019-04-13 09:48:44
【问题描述】:

我有一个包含 PERSON_ID、MOVING_DATE 和 PLACE 的 3 列的 pandas DataFrame,如下所示:

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'}
)

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

提前致谢,

雷南

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    sort 在这里是多余的,这是 O(nlogn) 的时间复杂度,当您可以使用 locidxmax 做到这一点时:

    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
    

    【讨论】:

    • 出于好奇,这个方法的复杂性是什么,logn?
    • @Yuca 它是 O(n)
    • 那么这应该是公认的答案
    【解决方案2】:

    要添加到@Yuca 并提供答案,您还可以使用 pandas 库中提供的 .max() 函数,方法与添加 .last() 的方式相同。

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

    【讨论】:

    • 嗨@Tyler Filko,感谢您的回答,但是 .max() 方法将使用地点名称的字母来选择最大地点,不是吗?
    【解决方案3】:

    使用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
    

    【讨论】:

    • 很好的答案@Yuca。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2014-09-21
    • 2021-06-01
    • 2021-12-15
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    相关资源
    最近更新 更多