Функция Apply не работает со столбцом фрейма данных - PullRequest
2 голосов
/ 08 ноября 2019

Я пытаюсь удалить специальные символы, такие как ",", ".", "-" (кроме запятой) из столбца "Актеры" моего фрейма данных pandas. Для этого я использую метод apply в столбце «Актеры»

df['Actors']= df['Actors'].apply(lambda x : x.lower().replace("[^a-zA-Z,]","",)
df['Actors'].head()

Вывод приведенного выше фрагмента показан ниже, и мы видим, что никакие специальные символы не были заменены:

1    tim robbins, morgan freeman, bob gunton, willi...
2    marlon brando, al pacino, james caan, richard ...
3    al pacino, robert duvall, diane keaton, robert...
4    christian bale, heath ledger, aaron eckhart, m...
5    martin balsam, john fiedler, lee j. cobb, e.g....
Name: Actors, dtype: object

Но когда я пытаюсь решить вышеуказанную проблему, используя приведенный ниже фрагмент кода, код работает:

df['Actors'] = df['Actors'].str.lower().str.replace("[^a-zA-Z,]","")
df['Actors'].head()

1    timrobbins,morganfreeman,bobgunton,williamsadler
2    marlonbrando,alpacino,jamescaan,richardscastel...
3    alpacino,robertduvall,dianekeaton,robertdeniro
4    christianbale,heathledger,aaroneckhart,michael...
5    martinbalsam,johnfiedler,leejcobb,egmarshall
Name: Actors, dtype: object

Я хочу знать, что с функцией apply не работает должным образом при замене символов?

Ответы [ 2 ]

3 голосов
/ 08 ноября 2019

Вы называете apply для серии, поэтому x в лямбде - это отдельная строка каждой строки серии. Итак, x.lower().replace - это питон replace. Python replace не поддерживает регулярные выражения. поэтому он рассматривает "[^a-zA-Z,]" как целую строку и ищет эту подстроку в каждом x. Не удалось найти его, поэтому ничего не было заменено.

С другой стороны, по умолчанию для Pandas str.replace установлено значение regex=True, поэтому он рассматривает "[^a-zA-Z,]" как шаблон регулярного выражения и правильно заменяет все

1 голос
/ 08 ноября 2019

Это не работает, потому что вы делаете замену строки, формально вы делаете str.replace("[^a-zA-Z,]","",). Ваше жало не содержит этих символов [^a-zA-Z,], поэтому ничего не удаляется. Если вы предпочитаете, python интерпретирует эти символы как регулярные выражения, но просто как строковые элементы.

Чтобы работать, вы должны сделать это следующим образом, просто ответить на ваш вопрос, потому что предпочтительный способ сделать это с вашим вторымпример.

remove = re.compile(r"[^a-zA-Z,]")
df['Actors']= df['Actors'].apply(lambda x : re.sub(remove, "", x.lower()))

Вот некоторые документы:

...