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

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

Pandas 使用第一個有效索引按組刪除 nan

Pandas 使用第一個有效索引按組刪除 nan

慕姐8265434 2022-06-14 10:06:18
我正在使用以下數據框:         Date    Id    Amount   0    201301    1      nan   1    201302    1      nan   2    201303    1      100   3    201304    1      120   4    201305    1      nan   5    201306    1      120   6    201302    2      nan   7    201303    2      150   8    201304    2      180我正在嘗試獲取Amountby的第一個有效索引Id。由于某種原因,這不起作用:df.groupby('Id').Amount.first_valid_index()我也在嘗試這個:df.groupby('Id').Amount.apply(lambda x: x.first_valid_index())但是我的數據集是 20M+ 行,所以它花費的時間太長了,這對我不起作用。有沒有更快的方法來按組查找第一個索引?我想要的輸出是:first_idx = [2,7]甚至更好:         Date    Id    Amount   2    201303    1      100   3    201304    1      120   4    201305    1      nan   5    201306    1      120   7    201303    2      150   8    201304    2      180編輯:df.groupby('Id').Amount.apply(lambda x: x.first_valid_index())確實有效,但我覺得必須有一個更快的選擇,問題似乎沒有那么復雜。
查看完整描述

2 回答

?
幕布斯7119047

TA貢獻1794條經驗 獲得超8個贊

選項 1:僅獲取第一個索引:


df[df.Amount.notna()].groupby('Id').Date.idxmin()

# 1.42 ms ± 14.1 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

輸出:


Id

1    2

2    7

Name: Date, dtype: int64

選項 2:要獲取其他行,請使用cumsumonnotna()


df[df['Amount'].notna().groupby(df['Id']).cumsum().gt(0)]

# 2.09 ms ± 220 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

選項3:您可以ffill()在組內選擇未填寫的:


df[df.groupby('Id').Amount.ffill().notna()]

# 831 μs ± 14.8 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

輸出:


     Date  Id  Amount

2  201303   1   100.0

3  201304   1   120.0

4  201305   1     NaN

5  201306   1   120.0

7  201303   2   150.0

8  201304   2   180.0

結論:選項3是最快的!


更新:使用選項 3 過濾兩端:


amt_group = df.groupby('Id').Amount

df[amt_group.bfill().notna() & amt_group.ffill().notna()]


查看完整回答
反對 回復 2022-06-14
?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

.notnull使用+創建一個掩碼.cumsum以獲取組內第一個非空值之后的所有內容Amount。然后做一片。


m = df.Amount.notnull().groupby(df.Id).cumsum().ge(1)


df.loc[m]

     Date  Id  Amount

2  201303   1   100.0

3  201304   1   120.0

4  201305   1     NaN

5  201306   1   120.0

7  201303   2   150.0

8  201304   2   180.0


查看完整回答
反對 回復 2022-06-14
  • 2 回答
  • 0 關注
  • 89 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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