2017-04-03 6 views
1

式に基づいてデータフレームに列を追加しようとしています。私の現在のソリューションは非常にpythonic /効率的だとは思わない。だから私はより速いオプションを探しています。 パンダデータフレームで式を使用する効率的な方法

は、私は式のステップの効率を向上させることができますどのように3列

import pandas as pd 
df = pd.DataFrame([ 
[1,1,20.0], 
[1,2,50.0], 
[1,3,30.0], 
[2,1,30.0], 
[2,2,40.0], 
[2,3,30.0], 
], 
columns=['seg', 'reach', 'len'] 
) 

# print df 
df 
    seg reach len 
    0 1  1 20.0 
    1 1  2 50.0 
    2 1  3 30.0 
    3 2  1 30.0 
    4 2  2 40.0 
    5 2  3 30.0 

# Formula here 
for index, row in df.iterrows(): 
    if row['reach'] ==1: 
     df.ix[index,'cumseglen'] = row['len'] * 0.5 
    else: 
     df.ix[index,'cumseglen'] = df.ix[index-1,'cumseglen'] + 0.5 *(df.ix[index-1,'len'] + row['len']) 

#print final results 
df 
    seg reach len cumseglen 
0 1  1 20.0 10.0 
1 1  2 50.0 45.0 
2 1  3 30.0 85.0 
3 2  1 30.0 15.0 
4 2  2 40.0 50.0 
5 2  3 30.0 85.0 

を持つテーブルを持っていますか?

答えて

2

私にとってこれはグループバイ作業のようです。つまり、各「セグメント」グループ内で、そのグループに何らかの操作を適用する必要があります。ここで

は、グループによると、各グループ内のいくつかの累積和を使用して、上からあなたの計算を実行するための一つの方法です:

import numpy as np 

def cumulate(group): 
    cuml = 0.5 * np.cumsum(group) 
    return cuml + cuml.shift(1).fillna(0) 

df['cumseglen'] = df.groupby('seg')['len'].apply(cumulate) 
print(df) 

結果:

seg reach len cumseglen 
0 1  1 20.0  10.0 
1 1  2 50.0  45.0 
2 1  3 30.0  85.0 
3 2  1 30.0  15.0 
4 2  2 40.0  50.0 
5 2  3 30.0  85.0 

アルゴリズム的に、これは正確ではありませんあなたが書いたものと同じですが、 "到達"列が "seg"列で示される新しい各セグメントの最初に1から始まると仮定して、これは機能するはずです。

+0

ありがとうございます!それは理にかなっている。 – Prashanth

関連する問題