从 pandas 列中删除非 ASCII 字符

新手上路,请多包涵

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


+------------------------------------------------ ----------
| DB_user 源计数 |
+------------------------------------------------ ----------
| ???/"Ò|Z?)?]??C %??JA 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() 需要一个字符,但找到了长度为 66 的字符串',u'出现在索引 2'

但是,我想通过在 filter_func 函数中使用循环,我通过将一个字符输入到“ord”中来处理这个问题。因此,当它遇到非 ASCII 字符时,应将其替换为空格。

有人可以帮帮我吗?

谢谢!

原文由 red_devil 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 903
2 个回答

您的代码失败,因为您没有将它应用于每个字符,您正在为每个单词和 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)

原文由 Padraic Cunningham 发布,翻译遵循 CC BY-SA 3.0 许可协议

你可以试试这个:

 df.DB_user.replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)

原文由 MaxU - stop russian terror 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题