首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一次处理一个列,而不是将整个数据保存在python中的内存中。

一次处理一个列,而不是将整个数据保存在python中的内存中。
EN

Stack Overflow用户
提问于 2018-05-24 03:48:48
回答 2查看 198关注 0票数 0

我有一个很大的红移数据集(大约300万行和1500列)。目前,我正在提取所有的数据,并做一些数据处理,如缺失值计算和创建假人等。我做的每一列通过循环通过列名。由于数据大小,这会消耗大量内存,因为我将整个数据保存在一个数据文件中,直到处理完成为止。

我正在考虑将数据存储在csv中,然后在每一列中读取,进行数据处理并将处理后的列写入csv。

数据

代码语言:javascript
复制
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中之后,目前正在做的事情。

代码语言:javascript
复制
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

代码语言:javascript
复制
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% )。

有人能帮我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-24 05:50:52

usecols参数在read_csv中将帮助您实现这一目标。我这样做的方式是,我会不停地加载数据的子集-

代码语言:javascript
复制
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来满足不同列的不同处理。

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2018-05-24 05:49:52

读取csv文件很慢,如果您的原始数据来自csv文件,您可以在chuck中读取csv文件,并使用hdf5将其附加到to_hdf(..., append=True)文件中。然后通过pd.read_hdf(..., columns=[...])阅读该列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50500646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档