2 回答

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()]

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
添加回答
舉報