Две вещи, которые нужно исправить:
Сначала , когда вы apply
лямбда-функцию для серии панд, лямбда-функция применяется к каждому элементу сериал.Я думаю, что вам нужно применить свою функцию ко всей серии в векторизованном виде.
Second , ваша функция имеет несколько операторов возврата.В результате будет выполняться только первое утверждение, return source.replace('[^A-Za-z]',' ')
.Все, что вам нужно сделать, - это внести изменения предварительной обработки в переменную source
внутри вашей функции и, наконец, вернуть измененный source
(или промежуточную переменную) в самом конце.
Чтобы переписать вашу функцию вработать на всей серии панд, заменять каждый случай source.
на source.str.
.Новое определение функции:
def data_preprocessing(source):
source = source.str.replace('[^A-Za-z]',' ')
#data['description'] = data['description'].str.replace('\W+',' ')
source = source.str.lower()
source = source.str.replace("\s\s+" , " ")
source = source.str.replace('\s+[a-z]{1,2}(?!\S)',' ')
source = source.str.replace("\s\s+" , " ")
return source
Тогда вместо этого:
data['description'] = data['description'].apply(lambda row: data_preprocessing(row))
data['event_name'] = data['event_name'].apply(lambda row: data_preprocessing(row))
Попробуйте это:
data['description'] = data_preprocessing(data['description'])
data['event_name'] = data_preprocessing(data['event_name'])