Rhe*_*els 6 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
Run Code Online (Sandbox Code Playgroud)
我想找到这个人基于其最后移动日期(MOVEMENT_DATE)的地方.
是否可以使用groupby方法获得结果?
到目前为止,我已经尝试过:
df = df.sort_values(['PERSON ID', 'MOVING DATE'])
df.groupby(['PERSON ID', 'MOVING DATE']).agg(
{'MOVING DATE': max, 'PLACE': 'last'}
)
Run Code Online (Sandbox Code Playgroud)
但它没有成功.任何帮助,将不胜感激.
提前致谢,
Rhenan
单线使用DataFrame.groupby
和Grouper.last
:
df.sort_values('MOVING DATE').groupby('PERSON ID').last()
Run Code Online (Sandbox Code Playgroud)
输出:
MOVING DATE PLACE
PERSON ID
1 2018-02-13 London
2 2017-06-12 Seatle
3 2017-09-19 Sao Paulo
Run Code Online (Sandbox Code Playgroud)
Asort
在这里有点矫枉过正,这是O(nlogn)
时间复杂度,当您可以使用loc
and执行此操作时idxmax
:
df.loc[df.groupby('PERSON ID')['MOVING DATE'].idxmax()]
Run Code Online (Sandbox Code Playgroud)
PERSON ID MOVING DATE PLACE
2 1 2018-02-13 London
3 2 2017-06-12 Seatle
5 3 2017-09-19 Sao Paulo
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1644 次 |
最近记录: |