为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

呼唤远方 2023-10-31 21:45:32
我遇到了 pd.rolling() 方法的问题,即使该函数返回单个值,该方法也会返回多个输出。我的目标是:计算每个 df 中包含 3 列的两个 DataFrame 之间的绝对百分比差异。将所有值相加我可以使用 pd.iterrows() 来做到这一点。但处理较大的数据集会使此方法无效。这是我正在使用的测试数据:#import librariesimport pandas as pdimport numpy as np #create two dataframesvalues = {'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  column30         7        1        31         2        5        62         3        2        33         1        4        94         3        1        75         2        5        16         5        5        27         3        3        38         2        1        79         4        5        510        6        3        411        8        5        112        1        8        413        3        1        214        7        6        915        3        4        616        7        2        517        2        3        118        6        9        419        3        1        120        8        4        3   0  1  20  2  3  41  3  4  12  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 SumOfAveragesRunningSums = df1.rolling(window=3,axis=0).apply(SumOfAverageFunction)这是我的问题,因为从上面打印 RunningSums 会输出几个值,并且与我使用 iterrows 方法得到的结果并不接近。我该如何解决这个问题?
查看完整描述

1 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

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


另外,第一个方法的输出看起来是错误的。实际上,您开始计算的时间已经晚了几行。


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)


查看完整回答
反对 回复 2023-10-31
  • 1 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信