pandasdataframe更换速度缓慢
我有一个Excel文件(.xlsx),大约有800行,128列,网格中的数据非常密集。 大约有9500个单元我试图用Pandas数据框取代单元格的值:
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秒。 任何方式来加速呢? 这不是一个庞大的数据或任务,我期待大pandas的动作要快得多。 仅供参考我试着用同样的文件在CSV中做同样的处理,但节省的时间是最less的( replace()
约50秒)
战略
创build代表从文件名到文件名的map
pd.Series
。
stack
我们的数据框, map
,然后unstack
stack
build立
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 x 5dataframe
100 x 100
9500 x 800
9500 x 800
map
使用series
与dict
d = dict(zip(from_filenames, to_filenames))
我通过一次删除replace()
和一次使用set_value()一个元素来完成60秒的任务。