如何在熊猫中滚动计算sumproduct?

时间:2021-02-09 08:56:43

标签: python pandas

我的示例数据库如下:

    A   B   C   D
0   5   3   2   1
1   3   3   4   5
2   6   2   7   8
3   4   2   4   0
4   6   2   4   3

我想创建一个滚动窗口,并为每一行计算两列或更多列的总和。例如,回顾 4 和 min_periodsrolling() 参数设置为 3(即,如果有最少 3 行信息,则仅计算 sumproduct 值),我想计算列的 sumproduct AC,以及 AB 平方(即 ABB):

    A   B   C   D   A&C     A&B&B
0   5   3   2   1   NaN     NaN
1   3   3   4   5   NaN     NaN
2   6   2   7   8   64      96
3   4   2   4   0   80      112
4   6   2   4   3   94      91

我知道使用 rolling().agg() 计算列式总和/乘积很简单:

df.rolling(4, min_periods=3).agg(np.sum)
df.rolling(4, min_periods=3).agg(np.product)

但我没有弄清楚如何在不同的列中应用相同的聚合逻辑。

请注意,我的原始数据框非常大(3k 行,500 列),因此我希望尽可能避免使用循环。

1 个答案:

答案 0 :(得分:0)

嗯,实际上并没有那么难,我设法用非常简单的语法解决了它。我将这个问题和我的答案放在一起,因为这个主题中的问题并不多,希望它在未来也能帮助到其他人。

我们可以只取我们感兴趣的列,将它们水平逐个元素相乘,然后对乘法结果应用滚动总和:

df[['A','C']].product(axis=1).rolling(4, min_periods=3).sum()

df[['A','B','B']].product(axis=1).rolling(4, min_periods=3).sum()

这些将产生:

0      NaN
1      NaN
2     64.0
3     80.0
4     94.0

0       NaN
1       NaN
2      96.0
3     112.0
4      91.0

分别是所需的输出。