2017-04-03 69 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