Pandas Dataframe:如何从不同方向对2列执行操作

时间:2014-01-07 13:06:53

标签: python numpy pandas

我正在努力解决以下问题,我找不到任何优雅的解决方案,除了在一个循环中迭代虽然系列的每个元素。

我需要执行一个产品,然后对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()找到优雅/高效的解决方案。

任何帮助都会非常感激。

谢谢:)

2 个答案:

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