我有一个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-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})
问题在于我只能看到第一个日期而不是最后一个日期。我希望输出一个只包含两个元素的列表:第一个和最后一个日期。而不是整个列表。
答案 0 :(得分:8)
容易羞怯
df.groupby('id').dates.agg({'date ': ['first', 'last']})
答案 1 :(得分:4)
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]
答案 2 :(得分:2)
尝试:
df.groupby(['id']).apply(lambda x: [sorted(x['dates'])[0],
sorted(x['dates'])[-1]])
这需要排序两次,因此您可能希望将lambda定义为辅助函数。
答案 3 :(得分:2)
您可以使用内置的第一个和最后一个
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
答案 4 :(得分:2)
我从你离开的地方接过来,这里只有两行和列表理解你的解决方案:
SELECT
@rowno := @rowno + 1 AS `No.`
SUM(vg.count) AS sum,
vg. CODE,
lh.luchthavencode
FROM
(
SELECT
COUNT(*) AS COUNT,
vg.vertrekluchthaven AS CODE
FROM
tbl_vluchtgegevens vg
WHERE
vg.vertrekdatum2 <= NOW()
GROUP BY
vg.vertrekluchthaven
UNION
SELECT
COUNT(*) AS COUNT,
vg.aankomstluchthaven AS CODE
FROM
tbl_vluchtgegevens vg
WHERE
vg.vertrekdatum2 <= NOW()
GROUP BY
vg.aankomstluchthaven
) vg
INNER JOIN tbl_luchthaven lh ON lh.luchthavenID = vg.CODE
CROSS JOIN (SELECT @rowno := 0) rn
GROUP BY
vg. CODE
ORDER BY
sum DESC
LIMIT 10