2016-06-07 79 views
3

我想用大熊貓來推算一個大的數據矩陣(90 * 90000),然後是一個更大的數據矩陣(150000 * 800000)。 目前我正在測試筆記本電腦上的較小筆記本(8GB RAM,Haswell core 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分鐘。是否有另一個實現可以提高性能?

+0

您可以測試隔離行中包含'NaN'的索引,然後使用'.loc()'手動將單元格設置爲模式。我不知道它是否會給你更好的表現,但它是測試的替代品。 –

+0

@AlexPetralia感謝您的輸入,我試過這種方法,但掩蓋'NaN'值並沒有產生任何重大改進。 – Dahlai

回答

2

我嘗試不同的方法。關鍵的學習是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) 

感謝您的輸入!

2

試試這個:

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

感謝您的建議。我試過這個實現,但比我找到的解決方案慢了大約40%。見下面的答案。 – Dahlai