我hava pandas数据框,我必须按一些列进行分组。组中的大多数组只有一行,但有几行有多行。对于其中的每一个,我只想保留最早的日期。
我已经尝试了agg
和filter
函数,但它们似乎没有做我需要的。
def first(df):
if len(df) > 1:
return df.ix[df['date'].idxmin()]
else:
return df
df.groupby(['id', 'period', 'type').agg(first)
答案 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