2016-10-04 137 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()一个元素。