Pandas Concat сталкивается с ошибкой памяти - PullRequest
3 голосов
/ 18 апреля 2019

Я пытаюсь предварительно обработать данные для дальнейшего анализа.Сначала я читаю данные из CSV-файла (x).

Затем я делю их на три части.Наконец, мне нужно преобразовать один массив, используя get_dummies, concat и sum для результата groupby.

import pandas as pd

RawData_v2_clear=pd.read_csv('C:\\Users\\User\\Documents\\top200users_filtered.csv', 
        sep=';', usecols = ['Username', 'Code', 'Object'], error_bad_lines=False, 
        encoding='latin-1')

dfU = RawData_v2_clear['Username']              
dfT = RawData_v2_clear['Code']   
dfO = RawData_v2_clear['Object'] 

del RawData_v2_clear, dfO                               (to free up some memory)

df_newT = pd.concat([dfU,pd.get_dummies(dfT)],axis=1)

df_new_gbyT = df_newT.groupby('Username').sum()

Raw_Data_V2_clear имеет форму (~ 11 миллионов строк x 3 столбца).

Error:
  File "c:\Users\User\Desktop\Faulty_Skript.py", line XXX, in <module>
    df_newT = pd.concat([dfU,pd.get_dummies(dfT)],axis=1).sum()
  File "C:\Users\User\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\reshape\reshape.py", line 866, in get_dummies
    dtype=dtype)
  File "C:\Users\User\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\reshape\reshape.py", line 963, in _get_dummies_1d
    dummy_mat = np.eye(number_of_cols, dtype=dtype).take(codes, axis=0)
MemoryError

В другой системе эта операция занимает некоторое время, но завершается без Memory Error.Может быть, у кого-то есть хорошая идея, чтобы исправить эту проблему с памятью?Может быть, append более дружественен к памяти, чем concat?Однако моя реализация append также не удалась в моей текущей системе.

Большое спасибо!

1 Ответ

1 голос
/ 18 апреля 2019

IIUC, попробуйте dtype='category' параметр в методе read_csv и pandas.crosstab вместо:

import pandas as pd

RawData_v2_clear=pd.read_csv('C:\\Users\\User\\Documents\\top200users_filtered.csv', 
        sep=';', usecols = ['Username', 'Code', 'Object'], error_bad_lines=False, 
        encoding='latin-1', dtype='category')

df_new_gbyT = pd.crosstab(RawData_v2_clear.Username, RawData_v2_clear.Code)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...