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

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

Pandas:將所有<= 0的值按組設置為列中的最大值,但僅在該組中的最后一個正值之后

Pandas:將所有<= 0的值按組設置為列中的最大值,但僅在該組中的最后一個正值之后

慕絲7291255 2022-07-26 15:48:02
我正在嘗試按組將所有 <= 0 的值設置為該組中的最大值,但僅在最后一個正值之后。也就是說,必須忽略組中最后一個正值之前的所有值 <=0。例子:data = {'group':['A', 'A', 'A', 'A', 'A', 'B', 'B',                 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C'],                  'value':[3, 0, 8, 7, 0, -1, 0, 9, -2, 0, 0, 2, 0, 5, 0, 1]} df = pd.DataFrame(data)df  group  value0   A      31   A      02   A      83   A      74   A      05   B     -16   B      07   B      98   B     -29   B      010  B      011  C      212  C      013  C      514  C      015  C      1結果必須是:  group  value0   A      31   A      02   A      83   A      74   A      85   B     -16   B      07   B      98   B      99   B      910  B      911  C      212  C      013  C      514  C      015  C      1謝謝指教
查看完整描述

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')


查看完整回答
反對 回復 2022-07-26
?
POPMUISE

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


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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