2014-02-12 38 views
2

我有一個列表中的扭曲數據存儲在文本中,我需要做一些爭論,但無法弄清楚什麼是最好和最有效的方法的巨大列表。另一個考慮因素是這個數據非常龐大。樣本量爲160萬行,產量高達數百萬。通過pandas.DataFrame糾正字符串中的拼寫錯誤

In [200]:data=['Bernard 51','Ber%nard Bachelor','BER78NARD$ bsc','BERnard$d B.'] 

In [201]:test=pd.DataFrame(data,columns=['Names']) 

In [2020:test 
Out[202]: 


    Names 
0 Bernard 51 
1 Ber%nard Bachelor 
2 BER78NARD$ bsc 
3 BERnard$d B. 

我的目標是輸出

Names 
0 bernard 
1 bernard ba 
2 bernard ba 
3 bernard ba 

我的僞代碼將是這樣的:

In[222]:test_processed=pd.DataFrame(test.Names.str.lower()) #covert all str to lower 

In[223]:test_processed 
Out[223]: 


    Names 
0 bernard 51 
1 ber%nard bachelor 
2 ber78nard$ bsc 
3 bernard$d b. 

In[224]:test_processed2=pd.DataFrame(test_processed.Names.str.replace('[^\w\s]','')) 
#removes punctuation/symbol typos 
In[225]:test_processed2 
Out[225]: 


    Names 
0 bernard 51 
1 bernard bachelor 
2 ber78nard bsc 
3 bernardd b 

In[226]:BA=['bachelor','bsc','b.'] #define list to be replaced with ba 

In[227]:test_processed.replace(BA,'ba') #replace list defined above with standard term 
Out[227]: 

    Names 
0 bernard 51 
1 ber%nard bachelor 
2 ber78nard$ bsc 
3 bernard$d b. 

#no change, didn't work 

我的觀察告訴我更換了一個列表不工作,如果被應用在其上熊貓數據框。

原因我沒有使用test_processed2.Names.str.replace是因爲DataFrame.str.replace不允許使用列表來替換。

我之所以使用列表,是因爲我希望隨着越來越多的不同變量的出現,可以輕鬆地維護列表。我很樂意聽取您的意見,如果您有解決方案或使用Python以外的更好的選擇,或者大熊貓。

+0

@sashkello 1.主要目的是從數據中刪除錯別字。 2.如果問題不清楚,那麼請耐心等待,但我需要有效地移除列表中的一串數據並將其替換。 – BernardL

+0

我明白你的需要。究竟是什麼問題?速度?正確性? – sashkello

+0

@sashkello基本上我不能找到一種方法,用標準術語來替換文本列表,特別是在pd.DataFrame。該清單是巨大的和扭曲的。 – BernardL

回答

1

test_processed.replace(BA,'ba')只會替換確切匹配項,而不是條目的一部分。也就是說,如果你的一個參賽作品是「單身漢」,它將會取而代之。對於部分字符串,您可以按照docs使用regex選項。

也有replace它在字符串上工作。因此,舉例來說,如果你有一個清單data並要替換「BSC」與「BA」的所有實例,你做的是這樣的:

data = [d.replace('bsc', 'ba') for d in data] 

接替者,你可以做的整個列表:

data = [d.replace(b, 'ba') for d in data for b in BA] 

現在,雖然我覺得這正是你問什麼,我應該提到這是最終沒有修復錯別字的正確途徑。想象一下,你有條目「B.Bernard,msc」 - 你會取代「B」。與「BA」,而這不應該發生。你的算法是非常基本的,因此是錯誤的。

相關問題