#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
>>>