微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 从pandas列中删除非ASCII字符

我一直试图解决这个问题.我试图从DB_user列中删除非ASCII字符并尝试用空格替换它们.但我不断收到一些错误.这就是我的数据框的外观:


+-----------------------------------------------------------
|      DB_user                            source   count  |                                             
+-----------------------------------------------------------
| ???/"Ò|Z?)?]??C %??J                      A        10   |                                       
| ?D$ZGU   ;@D??_???T(?)                    B         3   |                                       
| ?Q`H??M'?Y??KTK$?ً???ЩJL4??*?_??        C         2   |                                        
+-----------------------------------------------------------

我正在使用这个函数,这是我在研究SO上的问题时遇到的.

def filter_func(string):
   for i in range(0,len(string)):


      if (ord(string[i])< 32 or ord(string[i])>126
           break

      return ''

And then using the apply function:

df['DB_user'] = df.apply(filter_func,axis=1)

我一直收到错误


'ord() expected a character, but string of length 66 found', u'occurred at index 2'

但是,我想通过在filter_func函数中使用循环,我通过在’ord’中输入char来处理这个问题.因此,当它命中非ASCII字符时,它应该被空格替换.

有人可以帮帮我吗?

谢谢!

解决方法:

您编写失败,因为您没有在每个字符上应用它,您正在应用每个单词和ord错误,因为它需要一个字符,您需要:

  df['DB_user'] = df["DB_user"].apply(lambda x: ''.join([" " if ord(i) < 32 or ord(i) > 126 else i for i in x]))

您还可以使用链式比较简化连接:

   ''.join([i if 32 < ord(i) < 126 else " " for i in x])

您还可以使用string.printable来过滤字符:

from string import printable
st = set(printable)
df["DB_user"] = df["DB_user"].apply(lambda x: ''.join([" " if  i not in  st else i for i in x]))

最快的是使用翻译:

from string import maketrans

del_chars =  " ".join(chr(i) for i in range(32) + range(127, 256))
trans = maketrans(t, " "*len(del_chars))

df['DB_user'] = df["DB_user"].apply(lambda s: s.translate(trans))

有趣的是,这比以下更快:

  df['DB_user'] = df["DB_user"].str.translate(trans)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐