2016-03-30 65 views
0

我有一個大型數據集~1GB,行數達到1400萬行。我想清理國名;即,例如,將CA替換爲CANADAPython:什麼是替代大熊貓字符串的有效方法

我想:

mttt_pings.replace(['^CA$', '^US$', '^UNITED STATES$', '^MX$', '^TR$', 'GB', 
        '^ENGLAND$', '^AU$', '^FR$', '^KOREA, REPUB OF$', 
        '^CONGO, DEM REP.$', '^SYRIA$', '^DOMINICAN REP.$', 
        '^RUSSIA$', '^TAIWAN$', '^UAE$', '^LIBYA$'], 
        ['CANADA', 'UNITED STATES OF AMERICA', 
        'UNITED STATES OF AMERICA', 'MEXICO', 'TURKEY', 
        'UNITED KINGDOM', 'UNITED KINGDOM', 'AUSTRALIA', 'FRANCE', 
        'KOREA, REPUBLIC OF', 'CONGO', 'SYRIA ARAB REPUBLIC', 
        'DOMINICAN REPUBLIC', 'RUSSIA FEDERATION', 
        'TAIWAN, PROVINCE OF CHINA', 'UNITED ARAB EMIRATES', 
        'LIBYAN ARAB JAMAHIRIYA'], 
regex = True, inplace = True) 

這甚至不是完全替代列表只是一個子集。在我退出這個過程之前,這跑了約30分鐘。

然後我試着寫個人replaces但這還是太慢了。

  • 是否有更好的(更有效率)的方式來執行熊貓替換大量的行?
  • if語句的函數是否會更明智,然後使用 df.apply(function)
  • 或者我只是想念一些東西?

樣本集看起來像:

import time 
import pandas as pd 
t0 = time.time() 

df = pd.DataFrame({'ser_no': [1, 1, 1, 2, 2, 2, 2, 3, 3, 3], 
        'CTRY_NM': ['a', 'a', 'b', 'e', 'e', 'a', 'b', 'b', 'b', 'd']}) 

df.replace({'^a$': 'America'}, regex = True, inplace = True) 
df.replace({'^b$': 'Bahamas'}, regex = True, inplace = True) 
df.replace({'^c$': 'Congo'}, regex = True, inplace = True) 
df.replace({'^e$': 'Europe'}, regex = True, inplace = True) 
df.replace({'^a$': 'Dominican Republic'}, regex = True, inplace = True) 
tf = time.time() 
total = tf - t0 

顯然,這一套是太小,無法完全複製的時間問題。

對於這種情況,四次運行產生:tf = 0.00300002,tf = 00299978tf = 0.00200009tf = 0.00300002

import time 
import pandas as pd 
t0 = time.time() 

df = pd.DataFrame({'ser_no': [1, 1, 1, 2, 2, 2, 2, 3, 3, 3], 
        'CTRY_NM': ['a', 'a', 'b', 'e', 'e', 'a', 'b', 'b', 'b', 'd']}) 

df.replace(['^a$', '^b$', '^c$', '^d$', '^e$'], 
      ['America', 'Bahamas', 'Congo', 'Dominican Republic', 'Europe'], 
regex = True, inplace = True) 
tf = time.time() 
total = tf - t0 

在這裏,我們得到tf = 0.0019998tf = 0.00200009tf = 0.00200009,並且tf = 0.00200009

所以看起來取而代之的是快,但仍然對大數據集是很慢的名單版本。有任何想法嗎?

+0

爲什麼你不想在一個鏡頭呢? – MaxU

+0

@MaxU我從來沒有說過我不想要。它只需要很長的時間,所以我正在努力尋找更好的方法。 – dustin

+0

我很困惑。這些都在同一列嗎?他們是否隨機分散在整個數據框中?我認爲你想沿着適當的軸向量化,並且只限於你真正關心的列。這應該有助於加速它,不是嗎? – szeitlin

回答

1

對於DataFrame上存在的大多數方法,有一個可以在列上工作的Series等價物。這似乎沒有在0.18(還!)的文檔中。

這爲我工作:

df['CTRY_NM'].replace(to_replace=['^b','^c'], value=['America','Bahamas'], regex=True)

應至少快一點點?

+1

偉大的解決方案。它在很短的時間內工作。 – dustin

相關問題