isdigit () работает независимо, но не работает с np.where - PullRequest
1 голос
/ 19 сентября 2019

У меня есть кадр данных, как показано ниже

    Info
0   Tap
1   15k
2   rot
3   12psi

Я работаю с кодом ниже, чтобы получить только числовые значения в новом столбце.Если строка не содержит числовых значений, «-» должно быть в новом столбце

df['num']=np.where(any(char.isdigit() for char in df['Info']),df['Info'], '-')

Я получаю все '-` !!!

Однако при запуске any(char.isdigit() for char in <text to check> Я получаю истину или ложь правильно.

Например, any(char.isdigit() for char in '15k') возвращает True и

any(char.isdigit() for char in 'Tap') возвращает False.Это те же значения, что и в самом фрейме данных !!Любая идея, почему он не работает в np.where?

Ответы [ 2 ]

3 голосов
/ 19 сентября 2019

Проблема в том, что isdigit будет только True всякий раз, когда строка состоит исключительно из цифровых символов.Вот пример, чтобы проиллюстрировать это:

l = ['123', 'ab12', 'shf']

list(map(str.isdigit, l))
# [True, False, False]

Однако, когда запустить любой (char.isdigit () для char в я получаю true или false правильно

Это потому, что входной итератор для any в этом случае является строкой, и, следовательно, при итерации по строке он находит числовые значения:

any(char.isdigit() for char in '123aswd')
# True

Но, как показано в первоначальном примере, когдавходной итератор представляет собой список строк, если только они не состоят только из цифровых символов str.isdigit вернет False.


Вместо этого вы можете сделать что-то вроде:

df['num'] = df.Info.str.extract(r'(\d+)').fillna('-')

print(df)

    Info num
0    Tap   -
1    15k  15
2    rot   -
3  12psi  12
1 голос
/ 19 сентября 2019

Как уже упоминалось, есть две основные проблемы:

  1. Ваш isdigit() вернет False, если вся строка не является цифрой.
  2. np.where должен иметьту же структуру, которую вы пытаетесь вернуть обратно в df.В вашем случае вы передаете только одно логическое значение.

Попробуйте это:

df['num'] = np.where(df['Info'].str.contains('\d'), df['Info'], '-')

Вывод:

    Info    num
0    Tap      -
1    15k    15k
2    rot      -
3  12psi  12psi

Предполагается, что вы хотитевесь элемент скопирован.Если вам нужны только сами цифры, воспользуйтесь методом str.extract в ответе yatu.

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