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

标签 python 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)
        
        
            
        #printing my desired output values
        print(RunningSum)
[991.2698412698413,
 636.2698412698412,
 456.19047619047626,
 616.6666666666667,
 935.7142857142858,
 627.3809523809524,
 592.8571428571429,
 350.8333333333333,
 449.1666666666667,
 1290.0,
 658.531746031746,
 646.031746031746,
 597.4603174603175,
 478.80952380952385,
 383.0952380952381,
 980.5555555555555,
 612.5]

最后,下面是我尝试使用 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 方法得到的结果并不接近。我该如何解决这个问题?

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

最佳答案

这就是滚动的行为方式,它将围绕所有列打开窗口,我不知道有什么办法可以解决它。一种解决方案是将滚动应用于单个列,并使用这些窗口中的索引对函数内的数据帧进行切片。还是很贵,但可能没有你正在做的那么糟糕。

第一个方法的输出看起来也不正确。实际上,您开始计算的时间已经晚了几行。

import numpy as np

def 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)

关于python - 如何在 Pandas 中对多个列进行滚动除法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64305860/

相关文章:

python - Python中根据特定列分解数据集

python - 来自 Groupby Python 的多列数据透视表

python - 检查日期是否在另一个数据框中并设置一个新列

python - 如何断言类覆盖默认的 __hash__ 和 __eq__

python - Tensorflow 中的正确批量归一化功能是什么?

python - 将多索引 DataFrame 的所有列乘以 Series 中的适当值

python - Pandas 系列: change order of index

python - Pandas - 检查数据帧列是否包含键 :value pairs from a dictionary

python - 在 python 中调用外部程序,观察特定文本的输出然后采取行动

python - 计算给定数字之前的奇数