Python pd.rolling()返回多个输出时出现问题

Python pd.rolling()返回多个输出时出现问题,python,pandas,Python,Pandas,我遇到了pd.rolling()方法的问题,该方法返回多个输出,即使函数返回一个值 我的目标是: 计算每个df中有3列的两个数据帧之间的绝对百分比差 计算步骤1中每行的平均值 将步骤2中的平均值相加 我可以使用pd.iterrows()实现这一点。但是使用较大的数据集会使这种方法无效 这是我正在处理的测试数据: #import libraries import pandas as pd import numpy as np #create two dataframes values = {'

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

我的目标是:

  • 计算每个df中有3列的两个数据帧之间的绝对百分比差
  • 计算步骤1中每行的平均值
  • 将步骤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()生成所需的输出

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

    def SumOfAverageFunction(vals):
        Div = abs((((df2.values / vals.reset_index(drop="True").values)-1)*100))
        Average = Div.sum()
        SumOfAverages = Average.sum()
        return Average
    
    RunningSums = df1.rolling(window=3,axis=0).apply(SumOfAverageFunction)
    
    这是我的问题,因为从上面打印RunningSums会输出几个值,与我使用iterrows方法得到的结果不太接近。我如何解决这个问题

    print(RunningSums)
    
            column1      column2      column3
    0           NaN          NaN          NaN
    1           NaN          NaN          NaN
    2    702.380952   780.000000   283.333333
    3    533.333333   640.000000   533.333333
    4   1200.000000   475.000000   403.174603
    5    833.333333  1280.000000   625.396825
    6    563.333333   760.000000  1385.714286
    7    346.666667   386.666667  1016.666667
    8    473.333333   573.333333   447.619048
    9    533.333333  1213.333333   327.619048
    10   375.000000   746.666667   415.714286
    11   408.333333   453.333333   515.000000
    12   604.166667   338.333333  1250.000000
    13  1366.666667   577.500000   775.000000
    14   847.619048  1400.000000   683.333333
    15   314.285714   733.333333   455.555556
    16   533.333333   441.666667   474.444444
    17   347.619048   616.666667   546.666667
    18   735.714286   466.666667  1290.000000
    19   350.000000   488.888889   875.000000
    20   525.000000  1361.111111  1266.666667
    
    print(RunningSums)
    
            column1      column2      column3
    0           NaN          NaN          NaN
    1           NaN          NaN          NaN
    2    702.380952   780.000000   283.333333
    3    533.333333   640.000000   533.333333
    4   1200.000000   475.000000   403.174603
    5    833.333333  1280.000000   625.396825
    6    563.333333   760.000000  1385.714286
    7    346.666667   386.666667  1016.666667
    8    473.333333   573.333333   447.619048
    9    533.333333  1213.333333   327.619048
    10   375.000000   746.666667   415.714286
    11   408.333333   453.333333   515.000000
    12   604.166667   338.333333  1250.000000
    13  1366.666667   577.500000   775.000000
    14   847.619048  1400.000000   683.333333
    15   314.285714   733.333333   455.555556
    16   533.333333   441.666667   474.444444
    17   347.619048   616.666667   546.666667
    18   735.714286   466.666667  1290.000000
    19   350.000000   488.888889   875.000000
    20   525.000000  1361.111111  1266.666667