使用上述值简化数据框列部分的有效方法
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()
问题在于将零之间的数字序列更改为特定序列的第一个值。
示例:
输入(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()