在pandas数据帧中使用公式的有效方法

时间:2017-04-03 18:08:21

标签: pandas

我正在尝试根据公式向数据框添加列。我不认为我目前的解决方案是非常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

如何提高配方步骤的效率?

1 个答案:

答案 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开始,这应该可行。