Поскольку у вас есть панды, вы можете использовать здесь функцию pd.Series.notnull
панд, которая работает со смешанными типами.
>>> import pandas as pd
>>> {k: v for k, v in dict_cg.items() if pd.Series(v).notna().all()}
{30: ('A1', 55.0), 31: ('A2', 125.0), 32: ('A3', 180.0)}
Это не часть ответа, но может помочь вам понятькак я пришел к решению.Я столкнулся со странным поведением, пытаясь решить этот вопрос, используя pd.notnull
напрямую.
Take dict_cg[43]
.
>>> dict_cg[43]
('A4', nan)
pd.notnull
не работает.
>>> pd.notnull(dict_cg[43])
True
Он рассматривает кортеж как одно значение (а не итеративное из значений).Кроме того, преобразование этого в список и последующее тестирование также дает неправильный ответ.
>>> pd.notnull(list(dict_cg[43]))
array([ True, True])
Поскольку второе значение равно nan
, результат, который я ищу, должен быть [True, False]
.Наконец, это работает, когда вы предварительно преобразуете в Series:
>>> pd.Series(dict_cg[43]).notnull()
0 True
1 False
dtype: bool
Итак, решение состоит в том, чтобы Series-ify его, а затем проверить значения.
Аналогичным образом, другое (заведомо обходное) решение заключается в предварительном преобразовании в массив numpy object
dtype, и pd.notnull
будет работать напрямую:
>>> pd.notnull(np.array(dict_cg[43], dtype=object))
Out[151]: array([True, False])
Я думаю, чтоpd.notnull
непосредственно преобразует dict_cg[43]
в строковый массив под обложками, отображая NaN в виде строки "nan", поэтому оно больше не является "нулевым" значением.