2016-03-03 87 views
2

我想将列乘以其下方另一列中的所有值。因此,例如:熊猫乘以下列所有行中的另一列

r5,colC = (r5,colA * r6,colB) + 
      (r5,colA * r7,colB) + 
      (r5,colA * r8,colB) 
r6,colC = (r6,colA * r7,colB) + 
      (r6,colA * r8,colB) 

暂时我有一个可怕的循环解决方案:

df = pd.DataFrame(data=[[11,0.5],[12,0.4],[12,0.3],[13,0.2],[14,0.1],[15,0.6]], 
        index=[2001,2002,2003,2004,2005,2006], 
        columns=['A','B']) 

     A     B 
2001 11     0.50 
2002 12     0.40 
2003 12     0.30 
2004 13     0.20 
2005 14     0.10 
2006 15     0.60 

df['C'] = [(df.loc[i]['A']* df['B'][df.index > i]).sum() for i in df.index] 

     A     B     C 
2001 11     0.50    17.60 
2002 12     0.40    14.40 
2003 12     0.30    10.80 
2004 13     0.20     9.10 
2005 14     0.10     8.40 
2006 15     0.60     0.00 

编辑:

一些速度测试:

%timeit df['C'] = [(df.loc[i]['A']* df['B'][df.index > i]).sum() for i in df.index] 
%timeit df['D'] = df.B[::-1].cumsum()[::-1].shift(-1).fillna(0) * df.A 

1000 loops, best of 3: 1.69 ms per loop 
1000 loops, best of 3: 505 µs per loop 

回答

2

我相信这会实现自己的目标:

df['C'] = df.B[::-1].cumsum()[::-1].shift(-1).fillna(0) * df.A 

df.B[::-1]反转系列,然后累积和计算这一逆转系列,然后再反向把它按照原来的顺序。净效应是自下而上,而不是自上而下。

然后您需要将此cumsum行移一行并乘以列'A'。

fillna(0)用于匹配您的结果,否则底部数字将为NaN,因为它下面没有行。

+0

谢谢!比我的方法快3倍以上 – mptevsion

2

我不是对熊猫非常熟悉,但大概你可以用下面的方法(它使用numpy)来为你工作:

arr_1 = np.array([1,1,2,2,3]) 
arr_2 = np.array([10,20,40,80,-1]) 

upside_down_1 = np.flipud(arr_1) 
upside_down_2 = np.flipud(arr_2) 
upside_down_2 = np.concatenate(([1], upside_down_2))[:-1] 
upside_down_answer = upside_down_1 * np.cumprod(upside_down_2) 
answer = np.flipud(upside_down_answer) 

np.cumprod功能是什么在这里做魔术。翻转颠倒只是为了使其与当前指数以下的所有东西相乘,而不是高于/在。