我想計算pandas列的rolling_max,其中窗口大小變化,並且是當前行索引和滿足某些條件的行之間的差異。在df列中指定可變窗口大小的Pandas rolling_max
所以,作爲一個例子,我有:
df = pd.DataFrame({'a': [0,1,0,0,0,1,0,0,0,0,1,0],
'b': [5,4,3,6,1,2,3,4,2,1,7,8]})
我想df.b的rolling_max因爲df.a == 1之前的時間。即我希望得到這樣的:
a b rm
0 0 5 NaN <- no previous a==1
1 1 4 4 <- a==1
2 0 3 4
3 0 6 6
4 0 1 6
5 1 2 2 <- a==1
6 0 3 3
7 0 4 4
8 0 2 4
9 0 1 4
10 1 7 7 <- a==1
11 0 8 8
我DF具有無間隙的整數索引,所以我試圖做到這一點:
df['last_a'] = np.where(df.a == 1, df.index, np.nan)
df['last_a'].fillna(method='ffill', inplace=True)
df['rm'] = pd.rolling_max(df['b'], window = df.index - df['last_a'] + 1)
,但我得到一個類型錯誤:需要一個整數。
這是在相當大的數據框架上運行的長腳本的一部分,所以我需要儘可能快的解決方案。我已經成功嘗試用循環代替rolling_max來完成此操作,但速度很慢。能否請你幫忙?
僅供參考。醜陋的和長循環,我現在有,並且,不論其美醜,似乎是相當快的我的數據幀(50,000×25的測試)上,如下:
df['rm2'] = df.b
df['rm1'] = np.where((df['a'] == 1) | (df['rm2'].diff() > 0), df['rm2'], np.nan)
df['rm1'].fillna(method = 'ffill', inplace = True)
df['Dif'] = (df['rm1'] - df['rm2']).abs()
while df['Dif'].sum() != 0:
df['rm2'] = df['rm1']
df['rm1'] = np.where((df['a'] == 1) | (df['rm2'].diff() > 0), df['rm2'], np.nan)
df['rm1'].fillna(method = 'ffill', inplace = True)
df['Dif'] = (df['rm1'] - df['rm2']).abs()
大數據幀?最快的解決方案?有條件的聚合? SQL引擎解決方案的所有經典需求,讓您的RAM休息一下。數據是否來自RDMS? – Parfait
感謝您的建議Parfait!可能我會遵循它,因爲我目前的過程非常緩慢。我並沒有期待它那麼慢,我也希望在這個過程中學習一些Python。 –