在熊猫中向量化df.apply()操作

时间:2018-08-12 07:37:10

标签: python pandas numpy

我有一个(493,20)个pandas数据框,并希望为每行计算一个条件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的每一行都对应于其各自的中值。这是弹出的错误:ValueError: operands could not be broadcast together with shapes (493,2) (493,)

我如何能够矢量化此操作?与此类似的几个问题实际上并没有要求矢量化问题-只是使.apply()操作起作用。

1 个答案:

答案 0 :(得分:2)

如果输入数据中有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)