我有一个很大的红移数据集(大约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)中。
下面是我在读取DB中的数据并将其存储在df_data_sample中之后,目前正在做的事情。
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_sample保存在内存中,一次只加载一列,处理它,将已处理的列(如果是数字)和列(如果是绝对的话)写入另一个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% )。
有人能帮我吗?
发布于 2018-05-24 05:50:52
usecols参数在read_csv中将帮助您实现这一目标。我这样做的方式是,我会不停地加载数据的子集-
cols = ["sv_m1","rev","ioip","dvr_m1","geo_NJN","geo_CT","geo_AX","geo_BS"]
for col in cols:
df = pd.read_csv('sample.csv', usecols=[col])
print(df)显然,您将使用该列进行处理,而不是print(df)。
您可以使用if/else来满足不同列的不同处理。
希望这能有所帮助。
发布于 2018-05-24 05:49:52
读取csv文件很慢,如果您的原始数据来自csv文件,您可以在chuck中读取csv文件,并使用hdf5将其附加到to_hdf(..., append=True)文件中。然后通过pd.read_hdf(..., columns=[...])阅读该列。
https://stackoverflow.com/questions/50500646
复制相似问题