Ожидаемое поведение панд str .isnumeric ()

1

У меня есть многодисковые серии pd.Series такие как [100, 50, 0, foo, bar, baz]

когда я запускаю pd.Series.str.isnumeric()

Я получаю [NaN, NaN, NaN, False, False, False]

Почему это происходит? Разве он не должен возвращать True для первых трех в этой серии?

  • 0
    Запуск pd.Series.str.isnumeric() должен привести к ошибке.
Теги:
string
pandas

2 ответа

3
Лучший ответ

Строковые методы Pandas тесно связаны с методами Python:

str.isnumeric(100)    # TypeError
str.isnumeric('100')  # True
str.isnumeric('a10')  # False

Любой тип, который дает ошибку, даст NaN. Согласно документам Python, str.isnumeric применим только для строк:

str.isnumeric()
Возвращает true, если все символы в строке являются числовыми символами, и есть хотя бы один символ, иначе false.

Согласно документам Pandas, pd.Series.str.isnumeric эквивалентен str.isnumeric:

Series.str.isnumeric()
Проверьте, являются ли все символы в каждой строке в серии/индексе числовыми. Эквивалентен str.isnumeric().

Ваша серия имеет "объект" dtype, это всеохватывающий тип, который содержит указатели на произвольные объекты Python. Это может быть смесь строк, целых чисел и т.д. Поэтому вы должны ожидать значения NaN где строки не найдены.

Чтобы разместить числовые типы, вам нужно явно преобразовать строки, например, задать серию s:

s.astype(str).str.isnumeric()
  • 0
    Хорошо. Я думаю, что это отвечает на это. Таким образом, моя серия считывается как dtype объекта, но фактическими значениями являются некоторые строки и некоторые int, поэтому значения int оцениваются в nan, поскольку они не являются строками.
  • 0
    @ Андрей, да, именно так, я обновил свой ответ более подробным описанием.
3

Использование isnumeric строк преобразует ваши номера в NaN, это происходит, прежде чем вы даже попытаетесь использовать isnumeric:

s = pd.Series([100, 50, 0, 'foo', 'bar', 'baz'])
s.str[:]

0    NaN
1    NaN
2    NaN
3    foo
4    bar
5    baz
dtype: object

Таким образом, NaN остается, когда вы используете isnumeric. astype этого используйте astype:

s.astype(str).str.isnumeric()

0     True
1     True
2     True
3    False
4    False
5    False
dtype: bool
  • 0
    Благодарю. Это отвечает на мой вопрос, но @jpp ответил на него первым.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню