2017-04-03 99 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」列指示的每個新段的起始處開始,這應該起作用。

+0

謝謝!這就說得通了。 – Prashanth