熊猫乘以下列所有行中的另一列
问题描述:
我想将列乘以其下方另一列中的所有值。因此,例如:熊猫乘以下列所有行中的另一列
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
答
我相信这会实现自己的目标:
df['C'] = df.B[::-1].cumsum()[::-1].shift(-1).fillna(0) * df.A
df.B[::-1]
反转系列,然后累积和计算这一逆转系列,然后再反向把它按照原来的顺序。净效应是自下而上,而不是自上而下。
然后您需要将此cumsum
行移一行并乘以列'A'。
fillna(0)
用于匹配您的结果,否则底部数字将为NaN
,因为它下面没有行。
答
我不是对熊猫非常熟悉,但大概你可以用下面的方法(它使用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
功能是什么在这里做魔术。翻转颠倒只是为了使其与当前指数以下的所有东西相乘,而不是高于/在。
谢谢!比我的方法快3倍以上 – mptevsion