2017-10-11 129 views
0

我手邊的問題,我有看起來像如下所示的數據幀:轉換稀疏數據幀到密數據幀在python有效

輸入數據幀:

VEHICLE_HASH LS_ID UPPER_BOUND LS_RATIO 

00061E31E25B36 PROMISELS103 2500.0 0.000684 

00061E31E25B36 PROMISELS103a 3000.0 0.002001 

00061E31E25B36 PROMISELS104 3500.0 0.004128 

0006254DB52066 PROMISELS104 4000.0 0.003216 

0006254DB52066 PROMISELS103 4500.0 0.001114 

0006254DB52066 PROMISELS105 5000.0 0.020767 

這是一個採樣數據幀,實際數據幀的大小爲(53526122 x 4)。現在我想把這個數據幀轉換成一個OneHotEncoded矩陣,其特徵從字符串LS_IDUPPER_BOUND組合而成。我能夠做一個熱門的編碼,並將矩陣轉換爲稀疏矩陣,然後將稀疏矩陣與LS_ratio相乘,以得到我的xgboost分類器生成的輸入稀疏矩陣。

現在我想將數據幀轉換爲這種密集的格式,每行有一個獨特的HASH多列功能,所以我可以用這些數據做PCA。但我得到out of memmory error。這可以有效地完成嗎?

預期輸出:

HASH PROMISELS103a_3000.0 PROMISELS103_2500.0 PROMISELS103_4500.0 PROMISELS104_3500.0 PROMISELS104_4000.0 PROMISELS105_5000.0 

00061E31E25B36 0.002001  0.000684  0   0   0.004128  0     

0006254DB52066 0   0   0.001114  0.003216  0   0.020767 

回答

1

可以嘗試來連接LS_IDUPPER_BOUND列與分離器'_',構建交叉列表(假設在構成列中的所有元素和'VEHICLE_HASH'列是唯一的),和填充的NaN值爲零:

import pandas as pd 
import numpy as np 

df = pd.DataFrame() # here should be your initial dataframe 
df['ID_AND_BOUND'] = df['LS_ID'] + '_' + df['UPPER_BOUND'].astype(str) 
df_processed = pd.crosstab(index=df['VEHICLE_HASH'], 
          columns=df['ID_AND_BOUND'], 
          values=df['LS_RATIO'], 
          aggfunc=np.mean) 
df_processed = df_processed.reset_index().fillna(0) 
+0

感謝它非常有效地工作.. – ayaan