Apply功能不适用于数据框列

时间:2019-11-08 19:37:41

标签: python regex pandas dataframe apply

我正在尝试从熊猫数据框的“演员”列中删除特殊字符,例如“,”,“。”,“-”(逗号除外)。为此,我使用“演员”列上的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 个答案:

答案 0 :(得分:3)

您在序列上调用apply,因此lambda中的x是序列中每一行的单个字符串。因此,x.lower().replace是python replace。 Python replace不支持正则表达式。因此它将"[^a-zA-Z,]"视为一个完整的字符串,并在每个x中查找该子字符串。它找不到它,所以什么也没有替换。

另一方面,Pandas str.replace的默认选项为regex=True,因此它将"[^a-zA-Z,]"视为正则表达式模式并正确替换了所有内容

答案 1 :(得分:1)

它不起作用,因为您对字符串进行了替换,正式而言,您进行了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()))

一些文档: