Ошибка атрибута Python: объект ‘Series’ не имеет атрибута ‘isdigit’

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я пытаюсь заменить number на «пустой, если строка / столбец содержит числа. Я попробовал следующее, он продолжает жаловаться, что isdigit не существует? Я попытался преобразовать столбец в строку, но это не помогает. Есть ли другие операторы, которые я мог бы использовать для фрейма данных pandas?

 data = ['123567','1547892','2547879','ABC','3D']
df1 = pd.DataFrame(data)
df1.columns = ['col1']

df1.col1 = str(df1.col1)
if len(df1.col1) < 8 and df1.col1.isdigit(): # errors
    df1.col1 == ''
    print(df1)
  

Ищем вывод, подобный этому:

 col1
0   
1   
2   
3   ABC
4   3D
  

Ответ №1:

Чтобы получить доступ к строковым методам в серии, вам нужно сделать это через .str атрибут Series :

 df1.col1.str.isdigit()
  

Смотрите Series.str.isdigit() документацию.

Вы можете использовать это как логический индекс и напрямую присваивать выбранным строкам:

 df1.col1[df1.col1.str.isdigit()] = ''
  

Смотрите раздел Работа с текстовыми данными.

Не используйте df1.col1.str.isdigit() в if инструкции, потому что логический массив сам по себе не является True или False, это массив логических значений, и поэтому при использовании в логическом контексте он выдал бы ошибку ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all() .

ДЕМОНСТРАЦИЯ:

 >>> import pandas as pd
>>> data = ['123567','1547892','2547879','ABC','3D']
>>> df1 = pd.DataFrame(data)
>>> df1.columns = ['col1']
>>> df1
      col1
0   123567
1  1547892
2  2547879
3      ABC
4       3D
>>> df1.col1[df1.col1.str.isdigit()] = ''
>>> df1
  col1
0
1
2
3  ABC
4   3D
  

Комментарии:

1. Я пробовал это раньше, но я получил ошибку ValueError: истинное значение ряда неоднозначно. Используйте a.empty, a.bool(), a.item(), a.any() или a.all().

2. @sharp: Я уже показал вам в своем ответе, как это сделать правильно.

3. Спасибо, теперь это работает. Не уверен, почему это вызывало эту ошибку раньше.