Python 使用GroupByPandas对日期进行排序
我有一个熊猫数据框,其中包含格式为yyyy mm dd:Python 使用GroupByPandas对日期进行排序,python,sorting,pandas,dataframe,Python,Sorting,Pandas,Dataframe,我有一个熊猫数据框,其中包含格式为yyyy mm dd: id1 = ['2015-09-23', '2014-07-08', '2015-07-30', '2008-09-26', '2009-07-13', '2009-09-28', '2014-04-10', '2009-06-03'] id2 = ['2011-04-15', '2015-11-30', '2015-06-15', '2015-12-01', '2015-12-23', '2009-01-1
id1 = ['2015-09-23', '2014-07-08', '2015-07-30', '2008-09-26',
'2009-07-13', '2009-09-28', '2014-04-10', '2009-06-03']
id2 = ['2011-04-15', '2015-11-30', '2015-06-15', '2015-12-01',
'2015-12-23', '2009-01-14', '2009-06-17', '2009-08-07']
id3 = ['2010-01-26', '2010-03-16', '2011-11-23', '2012-01-31',
'2012-06-08', '2012-10-26', '2013-01-07', '2013-11-12']
df = pd.DataFrame({'dates':id1 + id2 + id3,'id':['id1']*8+['id2']*8+['id3']*8})
从这里,我想得到每个id的第一个和最后一个日期
我尝试了以下方法:
df.groupby(['id'])['dates'].agg({'sort':sorted})
问题是我只能看到第一次约会,不能看到最后一次。我希望输出一个只有两个元素的列表:第一个和最后一个日期。而不是整个列表。轻松
df.groupby('id').dates.agg({'date ': ['first', 'last']})
尝试:
这需要两次排序,因此您可能希望将lambda定义为帮助函数。您可以使用内置的first和last
df.groupby(['id'])['dates'].agg(['first', 'last'])
那就给你
first last
id
id1 2015-09-23 2009-06-03
id2 2011-04-15 2009-08-07
id3 2010-01-26 2013-11-12
我从您离开的地方开始学习,这是您的解决方案,只需两行文字和列表:
>>> new_df = df.groupby(['id'])['dates'].agg({'sort':sorted})
>>> new_df
sort
id
id1 [2008-09-26, 2009-06-03, 2009-07-13, 2009-09-2...
id2 [2009-01-14, 2009-06-17, 2009-08-07, 2011-04-1...
id3 [2010-01-26, 2010-03-16, 2011-11-23, 2012-01-3...
>>> new_df['sort'] = [[lst[0], lst[-1]] for lst in new_df['sort'].tolist()]
>>> new_df
sort
id
id1 [2008-09-26, 2015-09-23]
id2 [2009-01-14, 2015-12-23]
id3 [2010-01-26, 2013-11-12]
>>>
你在开玩笑吧?这是我感兴趣的解决方案,但它似乎是按列表中元素的顺序排序,而不是按日期排序。我想知道的是最早和最后的日期用最小值和最大值替换第一个和最后一个。你可以接受我的解决方案,然后哈哈,这是定义的第一个和最后一个函数吗?熊猫?在线查看文档
>>> new_df = df.groupby(['id'])['dates'].agg({'sort':sorted})
>>> new_df
sort
id
id1 [2008-09-26, 2009-06-03, 2009-07-13, 2009-09-2...
id2 [2009-01-14, 2009-06-17, 2009-08-07, 2011-04-1...
id3 [2010-01-26, 2010-03-16, 2011-11-23, 2012-01-3...
>>> new_df['sort'] = [[lst[0], lst[-1]] for lst in new_df['sort'].tolist()]
>>> new_df
sort
id
id1 [2008-09-26, 2015-09-23]
id2 [2009-01-14, 2015-12-23]
id3 [2010-01-26, 2013-11-12]
>>>
In[8]: df.groupby(['id']).dates.apply(lambda x: [min(x),max(x)])
Out[8]:
id
id1 [2008-09-26, 2015-09-23]
id2 [2009-01-14, 2015-12-23]
id3 [2010-01-26, 2013-11-12]