【问题标题】:Process columns in chunks and write to csv分块处理列并写入 csv
【发布时间】:2018-09-14 16:14:44
【问题描述】:

我有一个包含大约 250 万行和 7000 多列(所有分类)的数据框。 我遍历每一列,对变量进行虚拟化,并进行一些处理并连接到最终的数据帧。

代码如下:

cat_count = 0
df_final = pd.DataFrame()

for each_col in cat_cols: 

    df_temp = pd.DataFrame()
    df_single_col_data = df_data[[each_col]]
    cat_count += 1
    # Calculate uniques and nulls in each column to display in log file.    
    uniques_in_column = len(df_single_col_data[each_col].unique())
    nulls_in_column = df_single_col_data.isnull().sum()

    print('%s has %s unique values and %s null values' %(each_col,uniques_in_column,nulls_in_column[0]))


    #Convert into dummies 
    df_categorical_attribute = pd.get_dummies(df_single_col_data[each_col].astype(str), dummy_na=True, prefix=each_col)
    df_categorical_attribute = df_categorical_attribute.loc[:, df_categorical_attribute.var() != 0.0]# Drop columns with 0 variance.

    #//// Some data processing code://///

    df_final = pd.concat([df_final,df_categorical_attribute],axis = 1)
    print ('*'*10 + "\n Variable number %s processed!" %(cat_count))



# Write the final dataframe to a csv
df_final.to_csv('cat_processed.csv')

但是,对于如此大的数据,df_final 占用了服务器上高达 75% 的内存,我想减少这段代码的内存占用。

所以我的想法是,我将处理到第 300 列,将结果写入 csv。然后再次处理接下来的 300 列,打开 csv ,写入并关闭。 这样, df_final 一次只能保存 300 列的结果。 有人可以帮我吗? 或者,如果有更好的方法来处理这个问题,我也想实现它。

以下是一些要复制的示例数据: df_data

  rev_m1_Transform  ov_m1_Transform ana_m1_Transform    oov_m1_Transform
    0_to_12.95          34.95_to_846.4  65_to_74.95         64.9_to_1239.51
    13.95_to_116.55     14.95_to_19.95  45.05_to_60.05      34.9_to_39.95
    12.95_to_13.95      19.95_to_29.95  89.95_to_9491.36    54.95_to_59.95
    0_to_12.95          0_to_14.95      0_to_29.949999      64.9_to_1239.51
    0_to_12.95          19.95_to_29.95  74.95_to_83.9       54.95_to_59.95
    0_to_12.95          0_to_14.95      0_to_29.9499        0_to_34.9
    0_to_12.95          14.95_to_19.95  45.05_to_60.05      39.95_to_44.9
    0_to_12.95          0_to_14.95      0_to_29.949         0_to_34.9
    0_to_12.95          19.95_to_29.95  89.95_to_9491.36    54.95_to_59.95

cat_cols 是一个包含 df_data 中所有列名的列表 谢谢

【问题讨论】:

    标签: python pandas csv chunks


    【解决方案1】:

    不要选择列,而是选择行块,然后对所有列应用处理步骤。例如:

    CHUNKSIZE = 1000
    
    for chunk in pd.read_csv("filename.csv", chunksize=CHUNKSIZE):
        #Apply processing steps here 
        processed = process(chunk)
    
        processed.to_csv("final.csv", mode="a")
    

    根据您的物理内存大小 (RAM) 使用 CHUNKSIZE。

    【讨论】:

    • filename.csv 不存在,因为它是在所有处理完成后创建的。而且我需要阅读所有行,因为我发现了一些指标,例如每列的偏度、峰度。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    相关资源
    最近更新 更多