Как я могу применить функцию для удаления определенных символов в столбце набора данных?

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