提高 pandas 数据框插补性能

increasing pandas dataframe imputation performance

我想估算一个大数据矩阵 (90*90000),然后使用 pandas 估算一个更大的数据矩阵 (150000*800000)。 目前,我正在笔记本电脑上测试较小的数据集(8gb 内存,Haswell 核心 i5 2.2 GHz,较大的数据集将在服务器上 运行)。

这些列有一些缺失值,我想用所有行中出现频率最高的值来估算这些值。

我的工作代码是:

freq_val =  pd.Series(mode(df.ix[:,6:])[0][0], df.ix[:,6:].columns.values) #most frequent value per column, starting from the first SNP column (second row of 'mode'gives actual frequencies)
df_imputed = df.ix[:,6:].fillna(freq_val) #impute unknown SNP values with most frequent value of respective columns

在我的机器上进行插补大约需要 20 分钟。是否有其他实现可以提高性能?

试试这个:

df_imputed = df.iloc[:, 6:].fillna(df.iloc[:, 6:].apply(lambda x: x.mode()).iloc[0])

我尝试了不同的方法。学习的重点是mode这个函数真的很慢。或者,我使用 np.unique (return_counts=True) 和 np.bincount 实现了相同的功能。后者据说更快,但不适用于 NaN 值。

优化后的代码现在需要大约 28 秒到 运行。 MaxU 的回答在我的机器上需要 ~48 秒才能完成。

代码:

iter = range(np.shape(df.ix[:,6:])[1])
freq_val = np.zeros(np.shape(df.ix[:,6:])[1])
for i in iter:
    _, count = np.unique(df.ix[:,i+6], return_counts=True)
    freq_val[i] = count.argmax()
freq_val_series =  pd.Series(freq_val, df.ix[:,6:].columns.values) 
df_imputed = df.ix[:,6:].fillna(freq_val_series) 

感谢您的输入!