#python #pandas #dataframe #machine-learning #dataset
Вопрос:
Я хочу применить функцию, которая зацикливается на столбце набора данных, содержащего текстовые статьи. Статьи написаны на арабском языке, поэтому я хочу удалить все символы и весь английский алфавит. Это очистка текста для арабских статей.
Я создал цикл для замены определенных символов пустым значением. Когда я пытаюсь применить его, я получаю сообщение об ошибке AttributeError: объект ‘float’ не имеет атрибута ‘заменить’
Вот код со скриншотом ошибки:
var = d['Text']
def cleaning(var):
to_delete_characters = "1234567890abcdefghijklmnopqrstuvwxyz“”ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^amp;*()_ -""=|/?.,><;]:[؟،"
for character in to_delete_characters:
var = var.replace(character, "")
return var
var.apply(func_name)
Ссылка на скриншот ошибки:
введите описание изображения здесь
Ссылка на скриншот набора данных: введите описание изображения здесь
Ответ №1:
Для этого я бы рекомендовал использовать str.maketrans
и str.translate
:
trans = str.maketrans(dict.fromkeys(to_delete_characters, None))
d["Text"].str.translate(trans)
Это должно сработать, но у меня нет арабской клавиатуры для тестирования. Это также будет намного быстрее, чем итерационный метод, предложенный в другом ответе.
РЕДАКТИРОВАТЬ: возможно, вам сначала потребуется преобразовать NANS в пустые строки, я не уверен, как Панды будут обрабатывать NANS DataFrame.str.translate
. Я также рекомендовал бы в будущем предоставлять тестовые данные пользователям, отвечающим на ваш вопрос.
Комментарии:
1. @AhmadSham Я предлагаю, по крайней мере, взглянуть на мой ответ, так как он, скорее всего, будет намного быстрее, чем у U12.
2. Уважаемый сэр, я ценю ваши усилия, но я не знал, как это применить на самом деле 🙁
3. Я отредактировал свой ответ, чтобы включить точные имена переменных, которые вы используете. Вы должны просто иметь возможность скопировать и вставить мое решение.
Ответ №2:
Почему бы просто не сделать это одним лайнером:
to_delete_characters = "1234567890abcdefghijklmnopqrstuvwxyz“”ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^amp;*()_ -""=|/?.,><;]:[؟،"
var = d['Text'].astype(str).str.replace('|'.join(to_delete_characters)))
Или попробуй:
var = d['Text'].astype(str)
def cleaning(var):
to_delete_characters = "1234567890abcdefghijklmnopqrstuvwxyz“”ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^amp;*()_ -""=|/?.,><;]:[؟،"
for character in to_delete_characters:
var = var.replace(character, "")
return var
var.apply(func_name)
Редактировать:
Чтобы удалить несколько пробелов, попробуйте:
to_delete_characters = "1234567890abcdefghijklmnopqrstuvwxyz“”ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^amp;*()_ -""=|/?.,><;]:[؟،"
var = d['Text'].astype(str).str.replace('|'.join(to_delete_characters))).str.replace('s ', ' ')
Или попробуй:
import re
d['Text'] = d['Text'].astype(str)
def cleaning(var):
to_delete_characters = "1234567890abcdefghijklmnopqrstuvwxyz“”ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^amp;*()_ -""=|/?.,><;]:[؟،"
for character in to_delete_characters:
var = re.sub('s ', ' ', var.replace(character, ""))
return var
d['Text'] = d['Text'].apply(func_name)