2017-09-07 178 views
1

我有一個文本短信的csv文件,編碼爲utf-8Python:使用熊貓從CSV文件中刪除非ASCII字符

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可能是他們寫在一種非英語的語言我不太確定這些記錄發生了什麼。雖然sms列中使用的語言是非正式的(正如人們通常在短信中所做的那樣),但記錄1和2可以保留。如果我有大約200萬條記錄,那麼實現這個目標的便捷途徑是什麼?

編輯: 我想刪除非ASCII字符的任何行sms列。

+0

您能澄清完整要求的內容嗎?例如,您是否在嘗試過濾非英語全部的東西?不是ascii? – EdChum

+0

我想篩選「短信」值非ascii的所有記錄。 –

+0

[GSM 03.38](https://www.csoft.co.uk/support/character-sets#gsm_set)支持非ASCII字符,所以我不確定是否有效將其限制爲僅供ascii – EdChum

回答

4

使用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]+'在這裏它尋找十六進制v在ascii範圍內的線索高達128(7f),所以它尋找範圍在0-128(不包括128)的字符,我們否定這個使用^,以便它尋找的文本中的任何地方非ascii的存在,我們使用~翻轉此掩碼並使用它掩蓋df

+0

'str.isalnum('å')' >'True' ...我不認爲OP想要_非_非ASCII字符。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ爲什麼這應該是有效的鑑於OP的張貼樣本,目前他們還沒有說明除了過濾垃圾字符以外的全部要求 – EdChum

+0

錯誤......公平點。順便說一句,你的行是傾斜的:p –