提高 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)
感谢您的输入!
我想估算一个大数据矩阵 (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)
感谢您的输入!