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

在python中,一次处理一个列,而不是将整个数据保存在内存中,python,pandas,csv,numpy,Python,Pandas,Csv,Numpy,我有一个大的数据集,红移约300万行和1500列。目前我正在提取所有数据并进行一些数据处理,如 缺少值插补和创建虚拟对象等。我通过循环列名在每一列上执行此操作。这会消耗大量内存,因为 数据大小,因为我将整个数据保存在一个数据帧中,直到处理完成 我正在考虑将数据存储在csv中,然后读取每一列,进行数据处理,并将处理后的列写入csv 资料 因此,假设我的csv包含所有数据:seg_data.csv 我想阅读第一列,进行处理并将其写入另一个csv-final_seg.csv。 然后我想对下一列和下一列

我有一个大的数据集,红移约300万行和1500列。目前我正在提取所有数据并进行一些数据处理,如 缺少值插补和创建虚拟对象等。我通过循环列名在每一列上执行此操作。这会消耗大量内存,因为 数据大小,因为我将整个数据保存在一个数据帧中,直到处理完成

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

资料

因此,假设我的csv包含所有数据:seg_data.csv

我想阅读第一列,进行处理并将其写入另一个csv-final_seg.csv。 然后我想对下一列和下一列做同样的操作,对所有列也做同样的操作。 如果变量是分类变量(如geo),则数据处理可能涉及创建虚拟对象。 我在单独的csv中维护变量名和类型的映射,并将其加载到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
我在想,由于我一次只在内存中保留一列,这将减少我的内存使用率。目前,服务器上的内存使用率为75%


有人能帮我吗?

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

read_csv中的usecols参数将帮助您实现这一点。我这样做的方式是不断地反复加载数据的子集-

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)
显然,您将使用该列进行处理,而不是printdf

您可以使用if/else来满足不同列的不同处理

希望有帮助

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
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)