代码之家  ›  专栏  ›  技术社区  ›  Shuvayan Das

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

  •  0
  • Shuvayan Das  · 技术社区  · 8 年前

    我有一个很大的红移数据集(大约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%)。

    有人能帮我吗?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Vivek Kalyanarangan    8 年前

    这个 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 以适应不同列的不同处理。

    希望有帮助。

        2
  •  0
  •   HYRY    8 年前

    读取csv文件很慢,如果原始数据来自csv文件,则可以在chuck中读取csv文件,并使用 to_hdf(..., append=True) . 然后阅读专栏 pd.read_hdf(..., columns=[...]) .