Python:使用pandas从CSV文件中删除非ascii字符
我有一个csv文件,文本短信采用Python:使用pandas从CSV文件中删除非ascii字符,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个csv文件,文本短信采用utf-8编码 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
utf-8
编码
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字符的任何行。用于筛选非字母数字的行:
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
所以这里的正则表达式模式它查找ascii范围内的十六进制值,最大为128(7f),因此它查找范围为0-128(不包括128)的字符,我们使用
^
来否定这一点,以便它查找文本中任何地方是否存在非ascii,我们使用~
反转此遮罩,并使用此遮罩dfstr.isalnum('å')
->True
。。。我认为OP不需要任何非ascii字符。@cᴏʟᴅsᴘᴇᴇᴅ 考虑到OP发布的示例,这为什么无效?目前他们还没有说明除过滤垃圾字符外的所有要求。。。说得对。顺便说一句,您的行是倾斜的:p@cᴏʟᴅsᴘᴇᴇᴅ 支持这个字符,否则诺基亚和爱立信手机在他们的国家就没用了,而且我使用的是ipython QTConsole,所以输出看起来就像that@EdChum我已经更新了问题。您正在department
列上实现此功能,而我希望在sms
列上实现此功能。此外,str.isalnum()
为标点返回falsestr.isalnum(“test”)->false
。我会尝试正则表达式并进行更新。你能澄清完整的要求是什么吗?例如,你是否试图过滤掉不全是英语的内容?不是ascii?我想筛选“sms”值为非ascii的所有记录。支持非ascii字符,所以我不确定将其限制为ascii@SalA. 您可能希望也可能不希望保留某些非ascii字符,但这完全取决于您的用例。Ed Chum的回答保留了它们,我的回答丢弃了它们。仔细考虑并决定您真正需要的是什么。此外,还可以支持其他语言