Я хочу найти строки, содержащие строку, например:
DF[DF.col.str.contains("foo")]
Однако это не удается, потому что некоторые элементы имеют NaN:
ValueError: невозможно проиндексировать вектор, содержащий значения NA / NaN
Поэтому я прибегаю к запутанному
DF[DF.col.notnull()][DF.col.dropna().str.contains("foo")]
Есть ли способ лучше?
a
было заполнено из CSV, аa
столбец содержал строку «nan».pandas
«разумно» преобразовал это вNaN
и начал жаловаться, когда я попытался это сделатьdf.a.str.contains()
. Так что да совет: не забудьте установить тип столбцаread_csv()
или после этого сделать что-нибудь вродеdf = df.where(pandas.notnull(df), "nan")
LOLdf.loc
и не толькоdf
?В дополнение к приведенным выше ответам я бы сказал, что для столбцов, не имеющих имени из одного слова, вы можете использовать: -
Надеюсь это поможет.
источник
Я не на 100% объясняю, почему (на самом деле пришел сюда, чтобы искать ответ), но это тоже работает и не требует замены всех значений nan.
Работает с или без
.loc
.Я понятия не имею, почему это работает, поскольку я понимаю, что когда вы индексируете скобки, pandas оценивает все, что находится внутри скобок, как
True
илиFalse
. Я не могу сказать, почему фраза в скобках «лишнее логическое значение» вообще имеет какой-либо эффект.источник
Вы также можете патерн:
источник
DF [DF.col.str.contains ("foo"). Fillna (Ложь)]
источник
источник