在pandas数据框中,为每一行删除标点符号。

6

我刚接触Python,所以这可能是一个非常基本的问题。我正在尝试使用lambda函数来删除Pandas数据框中每一行的标点符号。我尝试了以下代码,但出现了错误。我想避免将df转换为列表,然后将清理后的结果附加到新列表中,然后再将其转换回df。

如果您有任何建议,请告诉我!

import string

df['cleaned'] = df['old'].apply(lambda x: x.replace(c,'') for c in string.punctuation)
2个回答

13
你需要在数据框中迭代字符串,而不是在string.punctuation上进行迭代。还需要使用 .join() 方法重新构建字符串。

你需要在数据框中迭代字符串,而不是在 string.punctuation 上进行迭代。你还需要使用 .join() 方法重新构建字符串。

df['cleaned'] = df['old'].apply(lambda x:''.join([i for i in x 
                                                  if i not in string.punctuation]))

当lambda表达式变得太长时,为了更易读,可以将函数定义单独写出来,例如(感谢@AndyHayden提供的优化提示):

当Lambda表达式过长时,将函数定义分离出来可以使代码更易读。例如(感谢@AndyHayden的优化建议):

def remove_punctuation(s):
    s = ''.join([i for i in s if i not in frozenset(string.punctuation)])
    return s

df['cleaned'] = df['old'].apply(remove_punctuation)

非常欢迎! - mechanical_meat
这里的一个改进是在remove_punctuation中使用set(string.punctuation)而不是string.punctuation。 - Andy Hayden
谢谢,安迪。我会加上的。 - mechanical_meat
方括号/列表推导式在连接操作中会给你另一个提升,顺带一提 :) - Andy Hayden
真的!现在我学到了一些东西。 - mechanical_meat
显示剩余3条评论

4

在这里使用正则表达式很可能会更快:

In [11]: RE_PUNCTUATION = '|'.join([re.escape(x) for x in string.punctuation])  # perhaps this is available in the re/regex library?

In [12]: s = pd.Series(["a..b", "c<=d", "e|}f"])

In [13]: s.str.replace(RE_PUNCTUATION, "")
Out[13]:
0    ab
1    cd
2    ef
dtype: object

1
这应该是被接受的答案... - clg4
1
同样地:s.str.replace('[{}]'.format(string.punctuation), '') - David C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接