我刚接触Python,所以这可能是一个非常基本的问题。我正在尝试使用lambda函数来删除Pandas数据框中每一行的标点符号。我尝试了以下代码,但出现了错误。我想避免将df转换为列表,然后将清理后的结果附加到新列表中,然后再将其转换回df。
如果您有任何建议,请告诉我!
import string
df['cleaned'] = df['old'].apply(lambda x: x.replace(c,'') for c in string.punctuation)
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)
在这里使用正则表达式很可能会更快:
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
s.str.replace('[{}]'.format(string.punctuation), '')
- David C