import pandas as pd
import numpy as np
def impute_row_median(
s: pd.Series,
threshold: float
) -> pd.Series:
'''For a vector of values, impute nans with median if %nan is below threshold'''
nan_mask = s.isna()
if nan_mask.any() and ((nan_mask.sum() / s.size) * 100) < threshold:
s_median = s.median(skipna=True)
s[nan_mask] = s_median
return s # dtype: float
df = pd.DataFrame(np.random.uniform(0, 1, size=(1000, 5)))
df = df.mask(df < 0.5)
df.apply(impute_row_median, axis=1, threshold=80) # slow
下面的apply相当慢(我没有使用timeit,因为我没有什么可以比较的)。我通常的方法是避免apply,而是使用向量化函数,如np.where,但我目前无法在这里想出一种方法来做到这一点。有人有什么建议吗?谢谢!
1条答案
按热度按时间8hhllhi21#
对于缺失值的计数百分比,使用带布尔掩码的
mean
,通过广播将2d mask
与numpy中的1d mask
链接,并替换DataFrame.mask
中的缺失值:与
numpy.where
类似:x一个一个一个一个x一个一个二个一个x一个一个三个一个
性能比较(10k行,50列):