我正在尝试从熊猫数据框的“演员”列中删除特殊字符,例如“,”,“。”,“-”(逗号除外)。为此,我使用“演员”列上的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函数是什么,它在替换字符时无法正常工作吗?
答案 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()))
一些文档: