gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:24:31 26 4
gpt4 key购买 nike

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


输入(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()

关于python - 使用上述值简化数据框列部分的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68290439/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com