2017-09-18 4 views
0

シリーズの「キャリーオーバー」を計算します。これにより、各行の値が計算され、以前の計算された値(前の行の値)に加算されます。パンダは、以前の値の出力を使用して関数を順番に適用します。

パンダでどうすればいいですか?

あなたは[i]とvalの[I-1] valを持つデータフレームを作成し、単一の軸(この場合は1)を越え、あなたの関数を適用する pd.Series.shift()を利用することができます
decay = 0.5 
test = pd.DataFrame(np.random.randint(1,10,12),columns = ['val']) 
test 
    val 
0 4 
1 5 
2 7 
3 9 
4 1 
5 1 
6 8 
7 7 
8 3 
9 9 
10 7 
11 2 

decayed = [] 
for i, v in test.iterrows(): 
    if i ==0: 
     decayed.append(v.val) 
     continue 
    d = decayed[i-1] + v.val*decay 
    decayed.append(d) 

test['loop_decay'] = decayed 
test.head() 

    val loop_decay 
0 4 4.0 
1 5 6.5 
2 7 10.0 
3 9 14.5 
4 1 15.0 

答えて

2

cumsum()のベクトル化されたバージョンを考えてみましょう。ここでは、最初にの値がで累積的に(val * decay)合計します。

cumsum()がそれを含んでいるのでしかし、あなたは非常に最初の(ヴァル*ディケイ)を減算する必要があります。

test['loop_decay'] = (test.ix[0,'val']) + (test['val']*decay).cumsum() - (test.ix[0,'val']*decay) 
+0

が最終的にテストに持ちこたえて、これはうまく動作します。パンダは、関数を累積的に適用できるように、 'rolling()'と同様の 'cumulative()'サブクラスを使うことができます。 – RSHAP

1

# Create a series that shifts the rows by 1 
test['val2'] = test.val.shift() 
# Set the first row on the shifted series to 0 
test['val2'].ix[0] = 0 
# Apply the decay formula: 
test['loop_decay'] = test.apply(lambda x: x['val'] + x['val2'] * 0.5, axis=1) 
+0

このコードは、なぜおよび/またはどのようにこのコードの回答に関する追加のコンテキストを提供し、質問に答えるかもしれないが問題はその長期的価値を向上させる。 –

+0

が最終的にそれをテストしていました - これはうまくいかないようです。 val2は各繰り返しで更新する必要があります。それは以前のヴァルだけではなく、変わった前のヴァルです。 – RSHAP

+0

謝罪、私は問題を誤解した@Parfaitは正しい答えを持っています –

関連する問題