使用groupby pandas对日期进行排序

时间:2017-03-08 00:40:52

标签: python sorting pandas dataframe

我有一个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})

enter image description here

由此,我想得到每个id的第一个和最后一个日期。

我尝试了以下内容:

df.groupby(['id'])['dates'].agg({'sort':sorted})

enter image description here

问题在于我只能看到第一个日期而不是最后一个日期。我希望输出一个只包含两个元素的列表:第一个和最后一个日期。而不是整个列表。

5 个答案:

答案 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