Странное поведение при проверке нуля pd.notnull - PullRequest
0 голосов
/ 26 июня 2018

Это, по сути, перефразировка содержания моего ответа здесь .

Я столкнулся со странным поведением, пытаясь решить этот вопрос , используя pd.notnull.

Рассмотрим

x = ('A4', nan)

Я хочу проверить, какие из этих элементов являются нулевыми. Использование np.isnan напрямую вызовет ошибку TypeError (но я понял, как ее решить).

Использование pd.notnull не работает.

>>> pd.notnull(x)
True

Он рассматривает кортеж как одно значение (а не как итерацию значений). Кроме того, преобразование этого в список и последующее тестирование также дает неправильный ответ.

>>> pd.notnull(list(x))
array([ True,  True])

Так как второе значение nan, результат, который я ищу, должен быть [True, False]. Наконец, это работает, когда вы предварительно конвертируете в серию:

>>> pd.Series(x).notnull() 
0     True
1    False
dtype: bool

Итак, решение состоит в том, чтобы последовательно его определить, а затем проверить значения.

Аналогичным образом, другое (заведомо обходное) решение заключается в предварительном преобразовании в массив numpy object dtype, и pd.notnull или np.isnan будут работать напрямую:

>>> pd.notnull(np.array(x, dtype=object))
Out[151]: array([True,  False])

Я предполагаю, что pd.notnull напрямую преобразует x в массив строк под обложками, отображая NaN в виде строки "nan", так что это больше не является "нулевым" значением.

pd.notnull делает здесь то же самое? Или что-то еще происходит под одеялом, о котором я должен знать?

Примечания

In [156]: pd.__version__
Out[156]: '0.22.0'

1 Ответ

0 голосов
/ 26 июня 2018

Вот проблема, связанная с этим поведением: https://github.com/pandas-dev/pandas/issues/20675.

Короче говоря, если аргумент, переданный notnull, имеет тип list, внутренне он преобразуется в np.array с помощью np.asarrayметод.Эта ошибка произошла, потому что, если не указано dtype, numpy преобразует np.nan в string (которое не распознается pd.isnull как нулевое значение):

a = ['A4', np.nan]
np.asarray(a)
# array(['A4', 'nan'], dtype='<U3')

Эта проблема была исправлена ​​вверсия 0.23.0, по телефону np.asarray с dtype=object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...