2015-12-27 14 views
5

私はこのような2列のパンダのデータフレームがあります。同じ列の以前の値に基づいて列の値をベクトル化して計算しますか?

df = pd.DataFrame(data={'A': [10, 2, 3, 4, 5, 6], 'B': [0, 1, 2, 3, 4, 5]}) 
>>> df 
    A B 
0 10 0 
1 2 1 
2 3 2 
3 4 3 
4 5 4 
5 6 5 

私は次のように新しい列Cを作成したい: C [i]は= C [I-1] -A [I]を仕事をしていません

df['C'] = df['A'] 

for i in range(1, len(df)): 
    df['C'][i] = df['C'][i-1] - df['A'][i] + df['B'][i] 

>>> df 
    A B C 
0 10 0 10 
1 2 1 9 
2 3 2 8 
3 4 3 7 
4 5 4 6 
5 6 5 5 

:+ B [i]はこのquestion

を答えは、このようなループの使用を提案しています。

しかし、ループは一般にベクトル化された計算に比べて遅いので、私はパンダにベクトル化された解決策があるかどうか疑問に思っていました。 (これがこの新しい質問の理由です)。

私はこの

df['C'] = df['C'].shift(1).fillna(df['A']) - df['A'] + df['B'] 

のようなシフト方式を使用しようとしたが、シフトC列が計算で更新されていないので、それは助けにはなりませんでした。

>>> df['C'].shift(1).fillna(df['A']) 
0 10 
1 10 
2  2 
3  3 
4  4 
5  5 

これは間違った結果をもたらします。

答えて

6

delta [i] = C [i] -C [i-1] = -A [i] + B [i]なので、問題はベクトル化できます。 AとBのデルタを最初に取得し、デルタの累積合計(プラスC [0])を計算して、次のようにフルCを得ることができます:

In [21]: 
delta = df['B'] - df['A'] 
delta[0] = 0 
df['C'] = df.loc[0, 'A'] + delta.cumsum() 
​ 
print df 
    A B C 
0 10 0 10 
1 2 1 9 
2 3 2 8 
3 4 3 7 
4 5 4 6 
5 6 5 5 
+0

Thanks @ Happy001それはまた、将来のための有用な教訓です:あなたが立ち往生した場合は、代数を行い、あなたの問題を再考してください。 – dimyG

関連する問題