Логические операции Pandas несовместимы с одним сравнением против множества сравнений - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь отфильтровать несколько строк в моем фрейме данных (с> 400000 строк), где значения в одном столбце имеют тип None.Цель состоит в том, чтобы оставить в моем фрейме данных только те строки, значения которых находятся в столбце «Столбец».Я планирую сделать это, передав массив логических значений, за исключением того, что я не могу правильно построить свой массив логических значений (все они возвращают значение True).

Когда я запускаю следующую операцию, учитывая значениеi в диапазоне df, сравнение работает:

df.loc[i, 'Column'] != None 

Строки, имеющие значение None в столбце, дают результаты False.

Но когда я запускаю эту операцию:

df.loc[0:len(df), 'Column'] != None 

Логический массив возвращается как все True.

Почему это?Это ошибка панд?Крайний случай?Намеренное поведение по причинам, которые я не понимаю?

Я могу придумать другие способы создания моего логического массива, хотя это кажется наиболее эффективным.Но меня беспокоит, что это результат, который я получаю.

1 Ответ

0 голосов
/ 12 ноября 2018

Вот воспроизводимый пример того, что вы видите:

x = pd.Series([1, None, 3, None, None])

print(x != None)

0    True
1    True
2    True
3    True
4    True
dtype: bool

Что не очевидно, то за кадром Pandas преобразует ваши серии в числовые и преобразует эти значения None в np.nan:

print(x)

0    1.0
1    NaN
2    3.0
3    NaN
4    NaN
dtype: float64

Массив NumPy, лежащий в основе серии, может затем храниться в непрерывном блоке памяти и поддерживать векторизованные операции.Поскольку np.nan != np.nan по проекту , ваша логическая серия будет содержать только True значения, даже если вы должны были проверить np.nan вместо None.

Для эффективности и правильности, вы должны использовать pd.to_numeric с isnull / notnull для проверки нулевых значений:

print(pd.to_numeric(x, errors='coerce').notnull())

0     True
1    False
2     True
3    False
4    False
dtype: bool
...