【发布时间】:2017-06-22 15:04:58
【问题描述】:
我想以矢量化方式编写以下代码,因为当前代码非常慢(并且想学习 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是一个数据框,对吧?df['OldCol']中的dtype或“NewCol”是什么?我认为这更像是一个很好的 pandas 编码问题,而不是 Pythonic 问题。 -
OldCol = (100,115,101,100,99,70,72,75,78,80,81,82,110)的期望结果是什么?
标签: python loops numpy vectorization