Замена всех значений в столбце условиями в фрейме данных

#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
#            ^^^^