Обработка столбцов в чанках и запись в csv - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть фрейм данных с 2,5 миллионами строк и более 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. Спасибо

1 Ответ

0 голосов
/ 14 сентября 2018

Вместо перехода к столбцам перейдите к фрагменту строк , затем примените шаг обработки ко всем столбцам.Например:

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

Используйте CHUNKSIZE в соответствии с объемом вашей физической памяти (RAM).

...