在python中有效地将稀疏数据帧转换为密集的Dataframe

时间:2017-10-11 08:24:29

标签: python pandas

我手边有一个问题,我的数据框看起来像下面那样:

输入数据框:

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 Matrix,其中的特征是由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 个答案:

答案 0 :(得分:1)

您可以尝试使用分隔符LS_ID连接UPPER_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)