用特定值之间的子集的最大值填充列
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。
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。