2 回答

TA貢獻1951條經驗 獲得超3個贊
首先添加一列來標識具有負值的行(更準確地說 <= 0):
df['neg'] = (df['value'] <= 0)
然后,對于每個組,找到'neg'設置為 True 且連續的最后幾個條目的序列。為此,請顛倒 DataFrame 的順序(帶.iloc[::-1]),然后.cumprod()在'neg'列上使用。cumprod()會將 True 視為 1,將 False 視為 0,因此只要您看到所有 True,累積乘積將為 1,并且一旦您看到第一個 False,累積乘積就會變為并保持 0。由于我們顛倒了順序,所以我們從末尾倒退,所以我們在末尾找到 True 的序列。
df['upd'] = df.iloc[::-1].groupby('group')['neg'].cumprod().astype(bool)
現在我們知道要更新哪些條目,我們只需要知道將它們更新到什么,這是組的最大值。我們可以transform('max')在 groupby 上使用來獲取該值,然后剩下的就是對設置的'value'位置進行實際更新'upd':
df.loc[df['upd'], 'value'] = df.groupby('group')['value'].transform('max')
我們可以通過刪除我們在該過程中使用的兩個輔助列來完成:
df = df.drop(['neg', 'upd'], axis=1)
我得到的結果與您的預期結果相符。
更新:或者在單個(長!)行中執行整個操作,而不向原始 DataFrame 添加任何輔助列:
df.loc[
df.assign(
neg=(df['value'] <= 0)
).iloc[::-1].groupby(
'group'
)['neg'].cumprod().astype(bool),
'value'
] = df.groupby(
'group'
)['value'].transform('max')

TA貢獻1765條經驗 獲得超5個贊
你可以這樣做。
(df.loc[(df.assign(m=df['value'].lt(0)).groupby(['group'], sort=False)['m'].transform('any')) &
(df.index>=df.groupby('group')['value'].transform('idxmin')),'value']) = np.nan
df['value']=df.groupby('group').ffill()
df
輸出
group value
0 A 3.0
1 A 0.0
2 A 8.0
3 A 7.0
4 A 0.0
5 B -1.0
6 B 0.0
7 B 9.0
8 B 9.0
9 B 9.0
10 B 9.0
11 C 2.0
12 C 0.0
13 C 5.0
14 C 0.0
15 C 1.0
添加回答
舉報