Pandas Сводная таблица возвращает MemoryError - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть фрейм данных, где я хочу объединить данные по нескольким столбцам (7, если быть точным) и вернуть сумму нескольких столбцов (4). Фрейм данных состоит из 172 тыс. Строк с 13 столбцами и занимает 13,2 МБ (подробности см. Ниже).

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 172038 entries, 0 to 172037
Data columns (total 13 columns):
index              172038 non-null int64
processing_date    172038 non-null int64
mgr_name           171910 non-null category
mgr_code           171937 non-null category
sub_mgr_name       133271 non-null category
sub_mgr_code       133287 non-null category
acct_id            172038 non-null int64
product_id         172038 non-null int64
fx_rate_usd        172038 non-null float64
settle_date_qty    172038 non-null float64
settle_date_mv     172038 non-null float64
seg_memo_qty       18956 non-null float64
restricted_qty     810 non-null float64
dtypes: category(4), float64(5), int64(4)
memory usage: 13.2 MB

Затем я пытаюсь повернуть его следующим образом:

client_grp_cols = ["processing_date", "mgr_name", "mgr_code", "sub_mgr_name",\
                      "sub_mgr_code", "acct_id", "product_id"]

client_sum_cols = ["settle_date_qty", "settle_date_mv", "seg_memo_qty", "restricted_qty"]


df_clients = df_client.pivot_table(index=client_grp_cols,
                                   values=client_sum_cols,
                                   aggfunc='sum')

Затем я получаю следующую ошибку:

MemoryError: Unable to allocate 237. PiB for an array with shape (266838394019915520,) and data type int8

Может кто-нибудь помочь мне понять, как такое бывает и как исправить? Я понимаю, что сводная таблица может сильно загружать память, но я не ожидала, что это будет так плохо. Я знаю, что могу переключиться в режим dask, но я действительно хотел бы попытаться остаться в pandas (в частности, поскольку мой базовый фрейм данных составляет всего 13 МБ, и я не думаю, что мне нужно это делать). .

Спасибо!

...