我们说我有一个包含3列的数据表:
Category Color Date
triangle red 2017-10-10
square yellow 2017-11-10
triangle blue 2017-02-10
circle yellow 2017-07-10
circle red 2017-09-10
我想找出每个类别的最早日期。 所以我想要的输出是:
Category Color Date
square yellow 2017-11-10
triangle blue 2017-02-10
circle yellow 2017-07-10
我已经浏览了几篇关于如何执行此操作的帖子:
Finding the min date in a Pandas DF row and create new Column
Pandas groupby category, rating, get top value from each category?
With Pandas in Python, select the highest value row for each group
等等。
一种流行的方法是groupby
方法:
df.groupby('Category').first().reset_index()
但是,如果我使用此方法,那么它会按Category
进行分组,但它会保留triangle
的两个记录,因为它有两种不同的颜色。
有更好,更有效的方法吗?
答案 0 :(得分:3)
您可以使用sort_values
+ drop_duplicates
:
df.sort_values(['Date']).drop_duplicates('Category', keep='first')
Category Color Date
2 triangle blue 2017-02-10
3 circle yellow 2017-07-10
1 square yellow 2017-11-10
如果您想保留Category
的原始订单,则需要对groupby
电话进行排序:
df.groupby('Category', group_keys=False, sort=False)\
.apply(lambda x: x.sort_values('Date'))\
.drop_duplicates('Category', keep='first')
Category Color Date
2 triangle blue 2017-02-10
1 square yellow 2017-11-10
3 circle yellow 2017-07-10
答案 1 :(得分:3)
以下内容应该为您提供所需的输出;与您发布的内容进行比较我首先根据日期对值进行排序,因为您希望保留每个类别的最早日期:
df.sort_values('Date').groupby('Category').first().reset_index()
这给出了所需的输出:
Category Color Date
0 circle yellow 2017-07-10
1 square yellow 2017-11-10
2 triangle blue 2017-02-10
修改强>
感谢评论中的@Wen,可以通过以下方式使这个调用更有效:
df.sort_values('Date').groupby('Category', as_index=False).first()
也给出了
Category Color Date
0 circle yellow 2017-07-10
1 square yellow 2017-11-10
2 triangle blue 2017-02-10
答案 2 :(得分:3)
head
会返回原始列
df.sort_values(['Date']).groupby('Category').head(1)
Out[156]:
Category Color Date
2 triangle blue 2017-02-10
3 circle yellow 2017-07-10
1 square yellow 2017-11-10
nth
:
df.sort_values(['Date']).groupby('Category',as_index=False).nth(0)
Out[158]:
Category Color Date
2 triangle blue 2017-02-10
3 circle yellow 2017-07-10
1 square yellow 2017-11-10
或idxmin
df.loc[df.groupby('Category').Date.idxmin()]
Out[166]:
Category Color Date
3 circle yellow 2017-07-10
1 square yellow 2017-11-10
2 triangle blue 2017-02-10