如何保留每个类别的最早记录但不考虑额外的列?

时间:2017-11-20 22:41:46

标签: python pandas pandas-groupby

我们说我有一个包含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的两个记录,因为它有两种不同的颜色。

有更好,更有效的方法吗?

3 个答案:

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