首页 > 解决方案 > 在 Pandas 中矢量化 df.apply() 操作

问题描述

我有一个 (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对应于其各自的中值。这是弹出的错误:ValueError: operands could not be broadcast together with shapes (493,2) (493,)

我怎样才能向量化这个操作?与此类似的几个问题实际上并没有要求对问题进行矢量化 - 而只是让 .apply() 操作工作。

标签: pythonpandasnumpy

解决方案


如果您有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)

推荐阅读