gpt4 book ai didi

python - 如何以矢量化方式而不是使用循环来编写代码?

转载 作者:太空狗 更新时间:2023-10-30 01:26:46 28 4
gpt4 key购买 nike

我想以矢量化的方式编写以下代码,因为当前代码非常慢(并且想学习 Python 最佳实践)。基本上,代码是说如果今天的值在昨天的值的 10% 以内,那么今天的值(在新列中)与昨天的值相同。否则,今天的值不变:

def test(df):
df['OldCol']=(100,115,101,100,99,70,72,75,78,80,110)
df['NewCol']=df['OldCol']
for i in range(1,len(df)-1):
if df['OldCol'][i]/df['OldCol'][i-1]>0.9 and df['OldCol'][i]/df['OldCol'][i-1]<1.1:
df['NewCol'][i]=df['NewCol'][i-1]
else:
df['NewCol'][i]=df['OldCol'][i]
return df['NewCol']

输出应该是这样的:

    OldCol  NewCol
0 100 100
1 115 115
2 101 101
3 100 101
4 99 101
5 70 70
6 72 70
7 75 70
8 78 70
9 80 70
10 110 110

你能帮忙吗?

我想使用这样的东西,但我没能解决我的问题:

def test(df):
df['NewCol']=df['OldCol']
cond=np.where((df['OldCol'].shift(1)/df['OldCol']>0.9) & (df['OldCol'].shift(1)/df['OldCol']<1.1))
df['NewCol'][cond[0]]=df['NewCol'][cond[0]-1]
return df

最佳答案

三步解决:

df['variation']=(df.OldCol/df.OldCol.shift())
df['gap']=~df.variation.between(0.9,1.1)
df['NewCol']=df.OldCol.where(df.gap).fillna(method='ffill')

对于:

    OldCol  variation    gap  NewCol
0 100 nan True 100
1 115 1.15 True 115
2 101 0.88 True 101
3 100 0.99 False 101
4 99 0.99 False 101
5 70 0.71 True 70
6 72 1.03 False 70
7 75 1.04 False 70
8 78 1.04 False 70
9 80 1.03 False 70
10 110 1.38 True 110

在这个例子中,它似乎比循环快 30 倍。

在一行中:

x=df.OldCol;df['NewCol']=x.where(~(x/x.shift()).between(0.9,1.1)).fillna(method='ffill')

关于python - 如何以矢量化方式而不是使用循环来编写代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42054802/

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