Python:使用pandas从CSV文件中删除非ascii字符

Sal*_* A. 3 python dataframe pandas

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

import pandas as pd
data = pd.read_csv('my_data.csv', sep=',')
data.head()
Run Code Online (Sandbox Code Playgroud)

它的输出如下:

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
Run Code Online (Sandbox Code Playgroud)

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

编辑: 我想删除列中包含非ascii字符的任何行sms.

EdC*_*ica 8

使用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
Run Code Online (Sandbox Code Playgroud)

更新

如果你真的想要过滤掉任何包含非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
Run Code Online (Sandbox Code Playgroud)

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