#python #pandas #dataframe #memory
#python #pandas #фрейм данных #память
Вопрос:
У меня приличный набор данных (37509, 166). В настоящее время я пытаюсь заменить 0 в нескольких столбцах на основе набора условий. Я продолжал получать ошибку памяти, пока не изменил это значение, и теперь мое ядро продолжает сбоить. Мои вопросы: есть ли лучший способ написать этот код, который позволяет избежать проблем с памятью?
df = pd.read_csv(".csv")
cols = list(df.select_dtypes(include=[np.number]).columns)
mask = (df["column1"] <= 0) amp; (df["column2"] == 0)
df.loc[mask, df[cols]] = np.nan
Два столбца, используемые для маски, не включены в список cols, и я пробовал по 1 столбцу за раз. Я каждый раз сталкиваюсь с ошибкой памяти. Я попытался запустить его через Terality с той же проблемой.
Ошибка:
Ошибка памяти: невозможно выделить 10,5 гигабайт для массива с формой (37509, 37509) и типом данных float64.
Следующий код также не работает (я понимаю, почему этот код не будет работать с копированием против представления) для списка столбцов или отдельного столбца:
df[mask][cols].replace(0, np.nan, inplace=True)
Если кто-нибудь захочет помочь объяснить решение или даже просто объяснить проблему, я был бы очень признателен.
Комментарии:
1.
df.loc[mask, df[cols]] = np.nan
должно бытьdf.loc[mask, cols] = np.nan
(индексатор столбца должен быть просто списком имен столбцов, а не фреймом данных этих столбцов)2. Не могли бы вы предоставить несколько примеров строк из вашего df? Таким образом, мы можем сгенерировать фрейм данных большего размера из образца.
Ответ №1:
DataFrame.loc
принимает либо логические значения, либо метки:
Доступ к группе строк и столбцов по меткам или логическому массиву.
В настоящее время индексатор столбцов представляет собой весь фрейм данных df[cols]
:
df.loc[mask, df[cols]] = np.nan
# ^^^^^^^^
Вместо df[cols]
этого используйте только cols
список:
df.loc[mask, cols] = np.nan
# ^^^^