Pandas:将所有<= 0的值按组设置为列中的最大值,但仅在该组中的最后一个正值之后

我正在尝试按组将所有 <= 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  value

0   A      3

1   A      0

2   A      8

3   A      7

4   A      0

5   B     -1

6   B      0

7   B      9

8   B     -2

9   B      0

10  B      0

11  C      2

12  C      0

13  C      5

14  C      0

15  C      1

结果必须是:


  group  value

0   A      3

1   A      0

2   A      8

3   A      7

4   A      8

5   B     -1

6   B      0

7   B      9

8   B      9

9   B      9

10  B      9

11  C      2

12  C      0

13  C      5

14  C      0

15  C      1

谢谢指教


慕丝7291255
浏览 74回答 2
2回答

饮歌长啸

首先添加一列来标识具有负值的行(更准确地说 <= 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[&nbsp; &nbsp; df.assign(&nbsp; &nbsp; &nbsp; &nbsp; neg=(df['value'] <= 0)&nbsp; &nbsp; ).iloc[::-1].groupby(&nbsp; &nbsp; &nbsp; &nbsp; 'group'&nbsp; &nbsp; )['neg'].cumprod().astype(bool),&nbsp; &nbsp; 'value'] = df.groupby(&nbsp; &nbsp; 'group')['value'].transform('max')

POPMUISE

你可以这样做。(df.loc[(df.assign(m=df['value'].lt(0)).groupby(['group'], sort=False)['m'].transform('any')) &&nbsp; &nbsp; (df.index>=df.groupby('group')['value'].transform('idxmin')),'value']) = np.nandf['value']=df.groupby('group').ffill()df输出group&nbsp; &nbsp;value0&nbsp; &nbsp;A&nbsp; &nbsp;3.01&nbsp; &nbsp;A&nbsp; &nbsp;0.02&nbsp; &nbsp;A&nbsp; &nbsp;8.03&nbsp; &nbsp;A&nbsp; &nbsp;7.04&nbsp; &nbsp;A&nbsp; &nbsp;0.05&nbsp; &nbsp;B&nbsp; &nbsp;-1.06&nbsp; &nbsp;B&nbsp; &nbsp;0.07&nbsp; &nbsp;B&nbsp; &nbsp;9.08&nbsp; &nbsp;B&nbsp; &nbsp;9.09&nbsp; &nbsp;B&nbsp; &nbsp;9.010&nbsp; B&nbsp; &nbsp;9.011&nbsp; C&nbsp; &nbsp;2.012&nbsp; C&nbsp; &nbsp;0.013&nbsp; C&nbsp; &nbsp;5.014&nbsp; C&nbsp; &nbsp;0.015&nbsp; C&nbsp; &nbsp;1.0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python