我想将列乘以其下方另一列中的所有值。例如:
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
答案 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
,因为其下方没有行。