私は、現在のコードがかなり遅いので、ベクトル化された方法で以下のコードを書いてみたいと思います(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'は、データフレームは、右、次のとおりです。1行で
? 'df ['OldCol']'や 'NewCol 'の' dtype'とは何ですか?私はこれがPythonicよりも良いパンダコーディングの問題だと思う。 – hpaulj
'' 'OldCol =(100,115,101,100,99,70,72,75,78,80,81,82,110)' ''の望ましい結果は何ですか? – wwii