我遇到了 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)
添加回答
举报
0/150
提交
取消