Проблемы с попыткой/исключением, попыткой преобразовать строки в целые числа во фрейме данных 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'.


person RF_PY    schedule 19.10.2016    source источник


Ответы (4)


вставьте 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
person Steven G    schedule 19.10.2016
comment
Спасибо за вашу помощь. К сожалению, это возвращает объект int, а не df. - person RF_PY; 19.10.2016
comment
хорошо, вы сообщаете свой код return int(row), я взял его из вашего исходного кода.. - person Steven G; 19.10.2016

рассмотреть 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'])
person piRSquared    schedule 19.10.2016

Работает так:

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
person RF_PY    schedule 19.10.2016

Используйте try/except в функции и используйте эту функцию с 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
>>>
person wwii    schedule 19.10.2016