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



我的数据帧如下所示:

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 个观测值,则应删除年份最低的观测值。

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

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

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

使用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具有intdtype:

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

使用 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)

最新更新