Pandas groupby然后选择一行

时间:2016-12-27 16:20:10

标签: python pandas

我hava pandas数据框,我必须按一些列进行分组。组中的大多数组只有一行,但有几行有多行。对于其中的每一个,我只想保留最早的日期。 我已经尝试了aggfilter函数,但它们似乎没有做我需要的。

def first(df):
        if len(df) > 1:
            return df.ix[df['date'].idxmin()]
        else:
            return df

df.groupby(['id', 'period', 'type').agg(first)

3 个答案:

答案 0 :(得分:7)

按日期排序,然后抓住第一行。

df.sort_values('date').groupby(['id', 'period', 'type']).first()

答案 1 :(得分:2)

还可以使用nsmallest()

df.groupby(['id', 'period', 'type']).apply(lambda g: g.nsmallest(1, "date"))

答案 2 :(得分:2)

使用最小日期的索引过滤df idxmin获取该索引。然后将其传递给loc

df.loc[df.groupby(['id', 'period', 'type']).date.idxmin()]

考虑df

df = pd.DataFrame([
        ['a', 'q', 'y', '2011-03-31'],
        ['a', 'q', 'y', '2011-05-31'],
        ['a', 'q', 'y', '2011-07-31'],
        ['b', 'q', 'x', '2011-12-31'],
        ['b', 'q', 'x', '2011-01-31'],
        ['b', 'q', 'x', '2011-08-31'],
    ], columns=['id', 'period', 'type', 'date'])
df.date = pd.to_datetime(df.date)

df

  id period type       date
0  a      q    y 2011-03-31
1  a      q    y 2011-05-31
2  a      q    y 2011-07-31
3  b      q    x 2011-12-31
4  b      q    x 2011-01-31
5  b      q    x 2011-08-31

然后

df.loc[df.groupby(['id', 'period', 'type']).date.idxmin()]

  id period type       date
0  a      q    y 2011-03-31
4  b      q    x 2011-01-31