【问题标题】:Python: Removing non-ascii characters from CSV file using pandas [duplicate]Python:使用熊猫从CSV文件中删除非ASCII字符[重复]
【发布时间】:2018-02-16 01:44:25
【问题描述】:

我有一个 utf-8 编码的文本短信 csv 文件。

import pandas as pd
data = pd.read_csv('my_data.csv', sep=',')
data.head()

它的输出如下:

id    city    department    sms                    category
01    khi      revenue      quk respns.                1
02    lhr      revenue      good.                      1
03    lhr      revenue      †h\0h2h\0hh\               0
04    isb      accounts     ?xœ1øiûüð÷üœç8i            0
05    isb      accounts     %â¡ã‘ã¸$ãªã±t%rã«ãÿã©â£    0

我想删除 sms 列具有垃圾值的所有记录/行,例如记录 3,4 和 5。可能它们是用英语以外的语言编写的,我不太确定这些发生了什么记录。记录 1 和 2 可以保留,尽管 sms 列中使用的语言是非正式的(就像人们通常在短信中所做的那样)。鉴于我有大约 200 万条记录,实现这一目标的便捷方法是什么。

编辑: 我想删除sms 列中所有非ascii 字符的行。

【问题讨论】:

  • 你能澄清一下完整的要求是什么,例如你是否试图过滤掉不是全英文的东西?不是ASCII?
  • 我要过滤所有“sms”值为非ascii的记录。
  • GSM 03.38 支持非 ascii 字符,所以我不确定将其限制为 ascii 是否有效
  • @SalA。您可能希望也可能不希望保留某些非 ascii 字符,但这完全取决于您的用例。 Ed Chum 的回答保留了他们,我的回答放弃了他们。仔细思考并决定你真正需要的是什么。
  • 另外也可以支持其他语言en.wikipedia.org/wiki/GSM_03.38

标签: python pandas dataframe


【解决方案1】:

使用str.isalnum 过滤非字母数字行:

In[46]:
df[df['sms'].str.isalnum()]

Out[46]: 
   id city department          sms  category
0   1  khi    revenue  quk respns.         1
1   2  lhr    revenue        good.         1

更新

如果您真的想过滤掉任何包含非 ascii 字符的行,那么您可以使用正则表达式模式:

In[72]:
df[~df['sms'].str.contains(r'[^\x00-\x7F]+')]

Out[72]: 
   id city department          sms  category
0   1  khi    revenue  quk respns.         1
1   2  lhr    revenue        good.         1

因此,正则表达式模式'[^\x00-\x7F]+' 在这里查找 ascii 范围内的十六进制值,最高可达 128 (7f),因此它查找范围为 0-128(不包括 128)的字符,我们使用 ^ 否定它以便它在文本中的任何地方寻找非 ascii 的存在,我们使用 ~ 反转此掩码并使用它来掩盖 df

【讨论】:

  • str.isalnum('å') -> True... 我不认为 OP 想要 any 非 ascii 字符。
  • @cᴏʟᴅsᴘᴇᴇᴅ 鉴于 OP 发布的示例,为什么这无效,目前他们没有说明除了过滤垃圾字符之外的全部要求
  • 错误...公平点。顺便说一句,您的行是倾斜的:p
  • @cᴏʟᴅsᴘᴇᴇᴅ GSM 03.38 支持该字符,否则诺基亚和爱立信手机在其本国将毫无用处,而且我正在使用 ipython QTConsole,所以输出看起来像这样
  • @EdChum 我已经更新了这个问题。您正在 department 列上实现此功能,而我想基于 sms 列执行此操作。此外,str.isalnum() 对标点符号 str.isalnum("test.") -> False 返回 false。我会尝试正则表达式并会更新。
猜你喜欢
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 2011-03-16
  • 2017-06-18
  • 2014-12-09
相关资源
最近更新 更多