Это, по сути, перефразировка содержания моего ответа здесь .
Я столкнулся со странным поведением, пытаясь решить этот вопрос , используя 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'