我遇到了 pd.rolling() 方法的問題,即使該函數(shù)返回單個值,該方法也會返回多個輸出。我的目標是:計算每個 df 中包含 3 列的兩個 DataFrame 之間的絕對百分比差異。將所有值相加我可以使用 pd.iterrows() 來做到這一點。但處理較大的數(shù)據(jù)集會使此方法無效。這是我正在使用的測試數(shù)據(jù):#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() ,這樣我就不需要循環(huán)每一行。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 方法得到的結(jié)果并不接近。我該如何解決這個問題?
1 回答

繁星淼淼
TA貢獻1775條經(jīng)驗 獲得超11個贊
這就是滾動的行為方式,它將圍繞所有列打開窗口,我不知道有什么辦法可以解決它。一種解決方案是將滾動應用于單個列,并使用這些窗口中的索引對函數(shù)內(nèi)的數(shù)據(jù)幀進行切片。還是很貴,但可能沒有你現(xiàn)在做的那么糟糕。
另外,第一個方法的輸出看起來是錯誤的。實際上,您開始計算的時間已經(jīng)晚了幾行。
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
提交
取消