【问题标题】:Apply function is not working on a data-frame column应用功能不适用于数据框列
【发布时间】:2020-03-05 10:54:12
【问题描述】:

我正在尝试从我的 pandas 数据框的“演员”列中删除特殊字符,例如“、”、“。”、“-”(逗号除外)。为此,我在“演员”列上使用了 apply 方法

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

上面sn-p的输出如下所示,我们可以看到没有特殊字符被替换:

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

但是当我尝试使用下面的 sn-p 解决上述问题时,代码有效:

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函数在替换字符时不能正常工作是怎么回事?

【问题讨论】:

    标签: python regex pandas dataframe apply


    【解决方案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()))
    

    下面是一些文档:

    【讨论】:

    • 您可以查看我上面使用的代码 sn-p,当我使用相同的正则表达式执行“应用”功能时,没有任何内容被替换。但是当我执行 str().replace() 时,空格、连字符、句号等特殊字符会被替换。您能否详细说明为什么会这样?谢谢
    • 是的,这是为了说明我的观点,因为很难解释它:)。我把文档放在了awser中。
    • 你能帮我解决我面临的另一个问题吗:
    【解决方案2】:

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

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

    【讨论】:

    • 非常感谢。您能否分享一些说明或解释 replace() 和 .str().replace() 之间区别的文档?再次感谢。
    • 熊猫str.replace 文档:pandas.pydata.org/pandas-docs/stable/reference/api/…。注意默认的regex=True
    • 有关 Python 字符串方法的文档。检查replacedocs.python.org/3/library/stdtypes.html#string-methods。注意:是python字符串replace。 Panda 有自己的 replace 方法,在您的情况下没有使用。
    • df['Actors'] = df.Actors.str.lower().str.replace('[^a-z]', '') --- 你已经把它降低了,所以不需要[^a-zA-Z]
    • @SarvagyaDubey:我发布了这个问题的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    相关资源
    最近更新 更多