亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

根據值計數列刪除已排序的行

根據值計數列刪除已排序的行

呼喚遠方 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條經驗 獲得超21個贊

使用 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 關注
  • 101 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號