我正在努力解决以下问题,我找不到任何优雅的解决方案,除了在一个循环中迭代虽然系列的每个元素。
我需要执行一个产品,然后对dataframa的每个元素进行总结,如下所示
import pandas as pd
import numpy as np
df = pd.DataFrame({'a':range(1,6,1), 'b':range(10,60,10)})
df=
a b
0 1 10
1 2 20
2 3 30
3 4 40
4 5 50
现在我想执行以下操作(基本上从两端开始,但不完全是颠倒一列的顺序):
df['c'][0] = df['a'][0] * df['b'][4]
df['c'][1] = df['a'][0] * df['b'][3] + df['a'][1] * df['b'][4]
df['c'][2] = df['a'][0] * df['b'][2] + df['a'][1] * df['b'][3] + df['a'][2] * df['b'][4]
...
df['c'][4] = df['a'][0] * df['b'][0] + df['a'][1] * df['b'][1] + ... + df['a'][4] * df['b'][4]
df=
a b c
0 1 10 50
1 2 20 40+ 100 =140
2 3 30 30 + 80 + 150 = 260
3 4 40 20 + 60 + 120 + 200 = 400
4 5 50 10 + 40 + 90 + 160 + 250 = 550
当然这里的数据是简化的,大约有1000行,但原理是一样的。
我想知道是否有办法用apply()和cumsum()找到优雅/高效的解决方案。
任何帮助都会非常感激。
谢谢:)
答案 0 :(得分:3)
此计算称为convolve
:
import pandas as pd
import numpy as np
df = pd.DataFrame({'a':range(1,6,1), 'b':range(10,60,10)})
np.convolve(df["a"].values, df["b"].values[::-1])[:5]
输出:
array([ 50, 140, 260, 400, 550])
答案 1 :(得分:0)
以下几行中的内容可以做,但请注意,您必须为大型数据框构建相当大的矩阵:
>>> import scipy.linalg
>>> x = np.zeros(len(df['b']))
>>> x[0] = list(df['b'])[-1]
>>> mult = scipy.linalg.toeplitz(x, df['b'][::-1])
>>> np.dot(df['a'], mult)
0 50
1 140
2 260
3 400
4 550
Name: a, dtype: float64