用特定值之间的子集的最大值填充列

Fill column with max value of a sub-set in-between a specific value

lvalues = [0,0,0,0,0,0,0,0,242,222,183,149,121,102,91,84,0,0,0,0,0,0,0,0,0,230,218,209,197,162,156,144,0,0,0,0,0,0,0,0]
idx = range(0,len(lvalues))

dfSample = pd.DataFrame(lvalues, index=idx)

我有一列在零之间有几个子集。我想遍历它并使用哪个子集的最高值并重复它直到它再次达到 0。例如,一旦循环达到 242,重复它直到 0 再次开始。提前致谢。

使用shift将零放在数字的开头,然后使用and条件将其与实际列合并。使用类似的过程来指定数字的结尾。之后,您可以使用 cumsum 进行分组,然后只需 groupby 和 return 每个 group 的第一个值。使用:

g =(((dfSample[0].shift()==0)&(dfSample[0]!=0))|((dfSample[0].shift(-1)==0)&(dfSample[0]!=0)).shift()).astype(int).cumsum()
dfSample.groupby(g).transform(lambda x: x.iloc[0])

输出:

    0
0   0
1   0
2   0
3   0
4   0
5   0
6   0
7   0
8   242
9   242
10  242
11  242
12  242
13  242
14  242
15  242
16  0
17  0
18  0
19  0
20  0
21  0
22  0
23  0
24  0
25  230
26  230
27  230
28  230
29  230
30  230
31  230
32  0
33  0
34  0
35  0
36  0
37  0
38  0
39  0

如果要按连续的 0/非 0 分组并获得最大值,请使用:

g = dfSample[0].eq(0).diff().fillna(False).cumsum()
dfSample.groupby(g).transform('max')

逻辑:将系列转换为布尔值并获取差异。每个组开始时都会有 True(除了我们填写的第一个项目)。获取 cumsum 来组队。使用石斑鱼获取每组的最大值。


如果您想用每个组的第一个值替换,一个简单的掩码和填充应该可以工作:

dfSample.mask(dfSample[0].shift(fill_value=0).ne(0)).ffill(downcast='infer')

逻辑:屏蔽前面没有 0 的值,ffill NaN。