使用上述值简化数据框列部分的有效方法

Efficient way of simplifying parts of a dataframe column with above values

问题在于将零之间的数字序列更改为特定序列的第一个值。

示例:

输入(df['p']) 期望的输出(df['Do'])
0 0
0 0
0 0
115 115
090 115
0 0
-80 -80
-90 -80
-70 -80
0 0

我已经尝试使用 np.where 和逻辑来查找必须更改的数字,但我无法扩展此解决方案。它只适用于一行。

示例:

                  #check a change in value   #eliminate the first change from zero   #assigning the above p value
df['A'] =np.where(df['p']!=df['p'].shift(1),np.where(df['p'].shift(1)==0,df['p'],df['p'].shift(1)),df['p'])
输入(df['p']) 实际输出(df['A'])
0 0
0 0
0 0
115 115
090 115
0 0
-80 -80
-90 -80
-70 -90
0 0

类似的东西应该可以工作,但是 np.where 不支持同一列之间的迭代。

                  #check a change in value   #eliminate the first change from zero   #assigning the above Do value
   #\/                                                                                 \/
df['Do'] = np.where(df['p']!=df['p'].shift(1),np.where(df['p'].shift(1)==0,df['p'],df['Do'].shift(1)),df['p'])

谢谢!

你想要的是不等于 (ne) 到 0 的行,并且前一行(shift)也不为 0。然后 mask 这些行的值和 ffill 传播前一个非 0 值

#input
df = pd.DataFrame({'p':[0,0,0,115,90,0,-80,-90,-70,0]})

# get the result
df['res'] = df['p'].mask(df['p'].ne(0) & df['p'].shift().ne(0)).ffill()

print(df)
     p    res
0    0    0.0
1    0    0.0
2    0    0.0
3  115  115.0
4   90  115.0
5    0    0.0
6  -80  -80.0
7  -90  -80.0
8  -70  -80.0
9    0    0.0

或者您可以只检查一次 ne 到 0 并在

之后使用 shift
m = df['p'].ne(0)
df['res'] = df['p'].mask(m & m.shift()).ffill()