2015-05-19 106 views
4

我想處理郵政編碼不容易格式化的非常大的文件(10,000+觀測)。我需要他們全部轉換成只是第5位,這裏是我當前的代碼:更快處理熊貓數據框

def makezip(frame, zipcol): 
    i = 0 
    while i < len(frame): 
     frame[zipcol][i] = frame[zipcol][i][:5] 
     i += 1 
    return frame 

幀是數據幀,並且zipcol是包含郵政編碼的列的名稱。雖然這有效,但處理需要很長時間。有更快的方法嗎?

+0

您需要避免使用for循環並使用'apply'方法。請參閱http://stackoverflow.com/questions/7837722/what-is-the-most-efficient-way-to-loop-through-dataframes-with-pandas – vmg

回答

7

您可以在字符串列上使用.str訪問器來訪問某些特定的字符串方法。而這一點,你也可以切片:

frame[zipcol] = frame[zipcol].str[:5] 

基於一個小例子,這大約是快50倍,遍歷行:

In [29]: s = pd.Series(['testtest']*10000) 

In [30]: %timeit s.str[:5] 
100 loops, best of 3: 3.06 ms per loop 

In [31]: %timeit str_loop(s) 
10 loops, best of 3: 164 ms per loop 

蒙山

In [27]: def str_loop(s): 
    .....:  for i in range(len(s)): 
    .....:   s[i] = s[i][:5] 
    .....: