dropna () в больших пандах CSV вызывает KeyError: MemoryError - PullRequest
0 голосов
/ 20 марта 2019

У меня есть DF, загруженный pd.read_csv (). 500 МБ, 4 столбца, 50ххх строк. Мне нужно удалить все строки с 0 или - (пробел) в 3-м (Allele1 - AB) или 4-м (Allele2 - AB) столбцах.

Мой код: Чтение CSV

data_skipped = pd.read_csv(cwd + file_list[i], sep='\t', skiprows = row_skipped_value, header = 0, index_col = False, dtype=object, low_memory = True)

Удаление пробелов

fixed_data = fixed_data.loc[fixed_data['Allele1 - AB' or 'Allele2 - AB'] != gap].dropna()

После удаления строки пробелов я получил ошибку:

KeyError: MemoryError()

Если я удаляю эту строку, все в порядке, и следующие шаги работают нормально (но в результате у меня есть файлы с пробелами). 14 ГБ свободной оперативной памяти.

Любой совет или решение?

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Ваш код не делает то, что вы хотите.

Pandas не использует and, or и т. Д. В качестве логического оператора. См. Документация Pandas :

Еще одной распространенной операцией является использование логических векторов для фильтрации данных.Операторы: |для или, и для и, и ~ для нет.Эти должны быть сгруппированы с использованием скобок

Таким образом, вы должны фильтровать данные таким образом.Вместо:

fixed_data = fixed_data.loc[fixed_data['Allele1 - AB' or 'Allele2 - AB'] != gap].dropna()

Do:

fixed_data.loc[(fixed_data['Allele1 - AB'] != gap) | (fixed_data['Allele2 - AB'] != gap)].dropna()

И это не требует дополнительного импорта других пакетов.

0 голосов
/ 20 марта 2019

Вы должны попробовать использовать

fixed_data.loc[fixed_data['Allele1 - AB' or 'Allele2 - AB'] != gap].dropna(inplace=True)

, и не переназначать его (будет возвращено None). В этом случае копия массива не будет создана, см. здесь .

Обновление: Я думаю, что ваш код не имеет особого смысла. 'Allele1 - AB' or 'Allele2 - AB' всегда будет иметь значение 'Allele1 - AB'. Я предполагаю, что вы хотите отбросить все строки, содержащие NaN, и хранить только те строки, столбец которых Allele1 - AB не равен gap, а Allele2 - AB не равен gap.

В этом случае используйте:

import numpy as np
fixed_data = fixed_data[np.logical_or(fixed_data["Allele1 - AB"] != gap, fixed_data["Allele2 - AB"] != gap)].dropna()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...