Pandas将列乘以

时间:2016-03-03 15:27:51

标签: python pandas

我想将列乘以其下方另一列中的所有值。例如:

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 个答案:

答案 0 :(得分: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功能正是在这里发挥作用的。颠倒翻转只是为了使其与当前指数以下的所有值相乘,而不是高于/在。

答案 1 :(得分:2)

我相信这将实现您的目标:

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

df.B[::-1]反转系列,然后在此反转系列上计算累积总和,然后再将其反转以使其按原始顺序排列。净效应是cumsum自下而上而不是自上而下。

然后,您需要将此cumsum行换一,然后将其乘以“A”列。

fillna(0)与您的搜索结果相符,否则底部编号为NaN,因为其下方没有行。