增加Pandas数据帧插补性能

2024-05-28 23:39:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

列中有一些缺失的值,我想用所有行中最频繁的一个来填充这些值。在

我的工作代码是:

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分钟。有没有其他的实现可以提高性能?在


Tags: columnsof数据mostdfvaluemodecolumn
2条回答

试试这个:

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

我尝试了不同的方法。关键的学习是mode函数非常慢。或者,我使用np.uniquereturn_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) 

感谢您的输入!在

相关问题 更多 >

    热门问题