2016-10-04 140 views
5

我有一個Excel文件(.xlsx)約800行,128列與網格中密集的數據。有大約9500細胞,我試圖取代使用大熊貓數據幀的單元值:熊貓緩慢的數據幀替換

xlsx = pandas.ExcelFile(filename) 
frame = xlsx.parse(xlsx.sheet_names[0]) 
media_frame = frame[media_headers] # just get the cols that need replacing 

from_filenames = get_from_filenames() # returns ~9500 filenames to replace in DF 
to_filenames = get_to_filenames() 

media_frame = media_frame.replace(from_filenames, to_filenames) 
frame.update(media_frame) 
frame.to_excel(filename) 

replace()需要60秒。任何方式來加速這一點?這不是龐大的數據或任務,我期待熊貓更快地移動。 FYI我試圖與CSV文件一樣做同樣的處理,但節省的時間是最小的(在replace()約50秒)

+0

'from_filenames'和'to_filenames'是'dicts'的列表? – jezrael

+0

@jezrael不只是扁平的字符串列表。單元值 – Neil

回答

6

戰略
創建pd.Series代表從一個文件名來map文件名。
stack我們的數據幀,map,然後unstack

設置

import pandas as pd 
import numpy as np 
from string import letters 

media_frame = pd.DataFrame(
    pd.DataFrame(
     np.random.choice(list(letters), 9500 * 800 * 3) \ 
      .reshape(3, -1)).sum().values.reshape(9500, -1)) 

u = np.unique(media_frame.values) 
from_filenames = pd.Series(u) 
to_filenames = from_filenames.str[1:] + from_filenames.str[0] 

m = pd.Series(to_filenames.values, from_filenames.values) 

解決方案

media_frame.stack().map(m).unstack() 

定時

5×5數據幀

enter image description here

100×100

enter image description here

9500 * 800

enter image description here

9500 * 800
map使用series VS dict
d = dict(zip(from_filenames, to_filenames))

enter image description here

1

我在10秒內完成了60秒的任務,完成刪除replace()並一次使用set_value()一個元素。