如何在 Pandas 中对多个列进行滚动除法?

我遇到了 pd.rolling() 方法的问题,即使该函数返回单个值,该方法也会返回多个输出。

我的目标是:

  1. 计算每个 df 中包含 3 列的两个 DataFrame 之间的绝对百分比差异。

  2. 将所有值相加

我可以使用 pd.iterrows() 来做到这一点。但处理较大的数据集会使此方法无效。

这是我正在使用的测试数据:

#import libraries

import pandas as pd

import numpy as np 


#create two dataframes

values = {'column1': [7,2,3,1,3,2,5,3,2,4,6,8,1,3,7,3,7,2,6,3,8],

        'column2': [1,5,2,4,1,5,5,3,1,5,3,5,8,1,6,4,2,3,9,1,4],

        "column3" : [3,6,3,9,7,1,2,3,7,5,4,1,4,2,9,6,5,1,4,1,3]

        }


df1 = pd.DataFrame(values)

df2 = pd.DataFrame([[2,3,4],[3,4,1],[3,6,1]])

print(df1)

print(df2)


    column1  column2  column3

0         7        1        3

1         2        5        6

2         3        2        3

3         1        4        9

4         3        1        7

5         2        5        1

6         5        5        2

7         3        3        3

8         2        1        7

9         4        5        5

10        6        3        4

11        8        5        1

12        1        8        4

13        3        1        2

14        7        6        9

15        3        4        6

16        7        2        5

17        2        3        1

18        6        9        4

19        3        1        1

20        8        4        3

   0  1  2

0  2  3  4

1  3  4  1

2  3  6  1

此方法通过使用 pd.iterrows() 生成我想要的输出


RunningSum = []

for index, rows in df1.iterrows():

    if index > 3:

        Div = abs((((df2 / df1.iloc[index-3+1:index+1].reset_index(drop="True").values)-1)*100))

        Average = Div.sum(axis=0)

        SumOfAverages = np.sum(Average)

        RunningSum.append(SumOfAverages)



最后,下面是我尝试使用 pd.rolling() ,这样我就不需要循环每一行。


def SumOfAverageFunction(vals):

    Div = abs((((df2.values / vals.reset_index(drop="True").values)-1)*100))

    Average = Div.sum()

    SumOfAverages = np.sum(Average)

    return SumOfAverages


RunningSums = df1.rolling(window=3,axis=0).apply(SumOfAverageFunction)

这是我的问题,因为从上面打印 RunningSums 会输出几个值,并且与我使用 iterrows 方法得到的结果并不接近。我该如何解决这个问题?


呼唤远方
浏览 80回答 1
1回答

繁星淼淼

这就是滚动的行为方式,它将围绕所有列打开窗口,我不知道有什么办法可以解决它。一种解决方案是将滚动应用于单个列,并使用这些窗口中的索引对函数内的数据帧进行切片。还是很贵,但可能没有你现在做的那么糟糕。另外,第一个方法的输出看起来是错误的。实际上,您开始计算的时间已经晚了几行。import numpy as npdef SumOfAverageFunction(vals):    return (abs(np.divide(df2.values, df1.loc[vals.index].values)-1)*100).sum()vals = df1.column1.rolling(3)vals.apply(SumOfAverageFunction, raw=False)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python