Проблемы с попыткой / исключением, попытка преобразовать строки в целые числа в фрейме данных pandas, где это возможно

#python #pandas #try-except

#python #pandas #попытка-исключение

Вопрос:

Я создал функцию для очистки любого HTML-кода / тегов из строк в моем фрейме данных. Функция принимает каждое значение из фрейма данных, очищает его с помощью функции remove_html и возвращает чистый df. После преобразования фрейма данных в строковые значения и его очистки я пытаюсь преобразовать, где это возможно, значения в фрейме данных обратно в целые числа. Я пробовал try / except, но не получаю желаемого результата. Это то, что у меня есть на данный момент:

 def clean_df(df):
    df = df.astype(str)
    list_of_columns = list(df.columns)
    for col in list_of_columns:
        column = []
        for row in list(df[col]):
            column.append(remove_html(row))
            try:
                return int(row)
            except ValueError:
                pass

        del df[col]

        df[col] = column

    return df
  

Без операторов try / except функция возвращает чистый df, где целые числа являются строками. Так что это просто оператор try / except, который, похоже, является проблемой. Я пробовал операторы try / except несколькими способами, и ни один из них не возвращает df. Текущий код, например, возвращает объект ‘int’.

Ответ №1:

вставьте columm.append в try:

 for col in list_of_columns:
    column = []
    for row in list(df[col]):
        try:
            column.append(remove_html(row))
        except ValueError:
            pass

    del df[col]

    df[col] = column

return df
  

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

1. Спасибо за вашу помощь. К сожалению, это возвращает объект int, а не df.

2. ну, вы указываете свой код return int(row) , я взял его из вашего исходного кода..

Ответ №2:

рассмотрим pd.DataFrame df

 df = pd.DataFrame(dict(A=[1, '2', '_', '4']))
  

введите описание изображения здесь

Вы хотите использовать функцию pd.to_numeric
Примечание
pd.to_numeric работает со скалярами и pd.Series . Он не работает на pd.DataFrame
Также
Используйте параметр errors='coerce' для получения чисел там, где вы можете, и NaN в другом месте.

 pd.to_numeric(df['A'], 'coerce')

0    1.0
1    2.0
2    NaN
3    4.0
Name: A, dtype: float6
  

Или, чтобы получить числа, где вы можете, и то, что у вас уже было в другом месте

 pd.to_numeric(df['A'], 'coerce').combine_first(df['A'])

0    1
1    2
2    _
3    4
Name: A, dtype: object
  

затем вы можете назначить его обратно своему df

 df['A'] = pd.to_numeric(df['A'], 'coerce').combine_first(df['A'])
  

Ответ №3:

Работает следующим образом:

 def clean_df(df):
df = df.astype(str)
list_of_columns = list(df.columns)
for col in list_of_columns:
    column = []
    for row in list(df[col]):
        try:
            column.append(int(remove_html(row)))
        except ValueError:
            column.append(remove_html(row))

    del df[col]

    df[col] = column

return df
  

Ответ №4:

Используйте попытку / исключение в функции и используйте эту функцию с DataFrame.applymap()

 df = pd.DataFrame([['a','b','1'],
                   ['2','c','d'],
                   ['e','3','f']])
def foo(thing):
    try:
        return int(thing)
    except ValueError as e:
        return thing

>>> df[0][2]
'e'
>>> df[0][1]
'2'
>>> df = df.applymap(foo)
>>> df[0][2]
'e'
>>> df[0][1]
2
>>>