[英]Vectorizing a df.apply() Operation in Pandas
我有一個(493,20)熊貓數據框,想要為每行計算一個條件np.nanmean()。 條件是該行中的每個值都必須高於某個閾值,而又要低於另一個閾值。 這是我當前的設置:
filt_avg_data= np.nanmean(data_tsl.apply(func= lambda x: x[(x < maxval*np.median(x)) & (x > minval*np.median(x))], axis= 1),axis=1)
其中maxval:10,minval:0.1和data_tsl.shape =(493,20)。 這樣可以。
但是,我想向量化此操作-我不想使用df.apply()函數。 我試過了
data_tsl>np.median(data_tsl,axis=1)
創建一個值的掩碼,可以在其上執行np.nanmean()操作,但是好像我無法使data_tsl
每一行都data_tsl
對應各自的中值。 這是彈出的錯誤: ValueError: operands could not be broadcast together with shapes (493,2) (493,)
我如何能夠向量化此操作? 與此類似的幾個問題實際上並沒有要求對問題進行矢量化處理-只是使.apply()操作起作用。
如果輸入數據中包含NaNs
,我想您想使用np.nanmedian
從中位數計算中忽略NaNs
。 隨之,我們可以將組合的掩碼用於上限和下限閾值,以將無效的掩碼也設置為NaNs
,最后使用np.nanmean
a = data_tsl.values # use data_tsl.values.copy() to avoid editing input df
med = np.nanmedian(a,axis=1)
U = maxval*med
L = minval*med
a[(a >= U[:,None]) | (a <= L[:,None])] = np.nan
out = np.nanmean(a,axis=1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.