为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

呼唤远方 2022-07-12 18:26:54
我的数据框如下所示:   year   id    0  2019   x11  2012   x12  2017   x13  2013   x14  2018   x25  2012   x26  2013   x2我想过滤我的整个数据框,这样如果每个 id 有超过 3 个观察值,则应该删除最低年份的观察值。在这种情况下,应删除第 1 行。   year   id    0  2019   x11  2017   x12  2013   x13  2018   x24  2012   x25  2013   x2
查看完整描述

3 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

DataFrame.sort_values与 一起使用GroupBy.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


查看完整回答
反对 回复 2022-07-12
?
慕仙森

TA贡献1827条经验 获得超8个赞

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


查看完整回答
反对 回复 2022-07-12
?
茅侃侃

TA贡献1842条经验 获得超22个赞

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


查看完整回答
反对 回复 2022-07-12
  • 3 回答
  • 0 关注
  • 185 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号