我有一个Excel文件(.xlsx),大约有800行和128列,网格中有非常密集的数据。我正在尝试使用Pandas数据框替换大约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秒。有什么方法可以加快速度吗?这不是庞大的数据或任务,我期待大熊猫的移动速度更快。仅供参考我尝试使用CSV中的相同文件进行相同的处理,但节省的时间很少(replace()
上约50秒)
答案 0 :(得分:7)
<强> 策略 强>
从文件名到文件名创建代表pd.Series
的{{1}}
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)
5 x 5数据框
100 x 100
9500 x 800
9500 x 800
media_frame.stack().map(m).unstack()
使用map
与series
的{{1}}
dict
答案 1 :(得分:1)
通过一次删除replace()
并一次使用set_value()一个元素,我在10秒内完成了60秒的任务。
答案 2 :(得分:0)
我发现创建新的col并删除现有的一列比永远等待更快。 ;)