我有一个很大的红移数据集(大约300万行,1500列)。目前,我正在提取所有数据并进行一些数据处理,比如
缺少值插补和创建虚拟对象等。我通过循环遍历列名称在每一列上进行此操作。这会消耗大量的内存,因为
数据大小,因为我将整个数据保存在一个数据帧中,直到处理完成。
我正在考虑将数据存储在一个csv中,然后在每个列中读取数据,进行数据处理并将处理后的列写入csv。
数据
sv_m1 rev ioip dvr_m1 geo
0 15.31 40 0 NJN
0 64.9 0 0 CT
0 18.36 20 0 AX
0 62.85 0 0 AL
0 10.31 20 0 BS
0 12.84 10 13.95 MN
0 69.95 0 0 CT
0 32.81 20 13.95 FX
所以说我的csv包含所有数据是:seg_data.csv
我想在第一列中阅读,进行处理并将其写入另一个csv-final_seg.csv。
然后我想对下一列和下一列做同样的事情,对所有列做同样的事情。
如果变量与geo类似,那么数据处理可能涉及创建虚拟对象。
我维护变量名的映射,并在单独的csv中键入,然后将其加载到dict(attribute_dict)中。
下面是我在从数据库读取数据并将其存储在df_data_示例中之后当前正在做的事情。
df_final = pd.DataFrame()
for column in df_data_sample.columns:
df_column = df_data_sample[[column]]
if (((attribute_dict[column] == 'CAT') & (df_column[column].unique().size < 100))==True):
df_target_attribute = pd.get_dummies(df_column[column], dummy_na=True, prefix=column)
df_target_attribute.fillna(0)
df_final[target_column] = df_target_attribute[[target_column]]
elif (attribute_dict[column] == 'NUM'):
#Let's impute with 0 for numeric variables:
df_target_attribute = df_column
df_target_attribute.fillna(value=0,inplace=True)
df_final[column] = df_target_attribute
所以,基本上我不想将df_data_样本保存在内存中,一次只加载一列,处理它,写入处理过的列(如果是数字的话)。
和列(如果是分类的话是虚拟的)转换成另一个csv。这应该发生在所有列中。
预期输出csv
sv_m1 rev ioip dvr_m1 geo_NJN geo_CT geo_AX geo_BS
0 15.31 40 0 1 0 0 0
0 64.9 0 0 0 1 0 0
0 18.36 20 0 0 0 1 0
0 62.85 0 0 1 0 0 0
0 10.31 20 0 0 0 0 1
0 12.84 10 13.95 0 0 1 0
0 69.95 0 0 0 1 0 0
0 32.81 20 13.95 0 0 0 1
我在想,由于我在内存中一次只保留一列,这将减少内存使用(目前服务器上的内存使用率为75%)。
有人能帮我吗?