根据值计数列删除排序的行

时间:2020-01-30 13:03:36

标签: python pandas

我的数据框如下:

   year   id    
0  2019   x1
1  2012   x1
2  2017   x1
3  2013   x1
4  2018   x2
5  2012   x2
6  2013   x2

我想过滤我的整个数据框,以便每个id观察到3个以上的观察值,则应删除年份最低的观察值。

在这种情况下,应该删除第一行。

   year   id    
0  2019   x1
1  2017   x1
2  2013   x1
3  2018   x2
4  2012   x2
5  2013   x2

3 个答案:

答案 0 :(得分:3)

DataFrame.sort_valuesGroupBy.head一起使用:

df = df.sort_values(['id','year'], ascending=[True, False]).groupby('id').head(3)
print (df)
   year  id
0  2019  x1
2  2017  x1
3  2013  x1
4  2018  x2
6  2013  x2
5  2012  x2

如果订单应该相同,请添加DataFrame.sort_index

df = df.sort_values(['id','year'], ascending=[True, False]).groupby('id').head(3).sort_index()
print (df)
   year  id
0  2019  x1
2  2017  x1
3  2013  x1
4  2018  x2
5  2012  x2
6  2013  x2

答案 1 :(得分:2)

使用GroupBy.nlargest

df = df.groupby('id')['year'].nlargest(3).reset_index().drop(columns='level_1')

   id  year
0  x1  2019
1  x1  2017
2  x1  2013
3  x2  2018
4  x2  2013
5  x2  2012

确保year具有int dtype:

df['year'] = df['year'].astype(int)

答案 2 :(得分:1)

使用for循环解决此问题(我喜欢循环)怎么样?

id_unique = df.id.unique()

df_new = pd.DataFrame(columns = df.columns)

for i in id_unique:
    df_new = pd.concat([df_new, df[df['id'] == i ].sort_values(['year'], ascending= [False]).head(3)], axis=0)
相关问题