2017-10-11 116 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