Pandas 数据框替换速度慢

Posted

技术标签:

【中文标题】Pandas 数据框替换速度慢【英文标题】:Pandas slow on data frame replace 【发布时间】:2017-02-12 04:29:00 【问题描述】:

我有一个 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 秒。有什么办法可以加快这个速度吗?这不是巨大的数据或任务,我期待熊猫移动得更快。仅供参考,我尝试对 CSV 中的相同文件进行相同的处理,但节省的时间很少(replace() 上大约 50 秒)

【问题讨论】:

from_filenamesto_filenameslistsdicts? @jezrael 不仅仅是简单的字符串列表。单元格值 【参考方案1】:

策略 创建pd.Series,代表从文件名到文件名的mapstack我们的数据框,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 x 5 数据帧

100 x 100

9500 x 800

9500 x 800map 使用 seriesdictd = dict(zip(from_filenames, to_filenames))

【讨论】:

【参考方案2】:

我通过完全删除 replace() 并一次使用 set_value() 一个元素,在 10 秒内完成了 60 秒的任务。

【讨论】:

【参考方案3】:

我发现创建新列并删除现有列一比永远等待要快。 ;)

【讨论】:

以上是关于Pandas 数据框替换速度慢的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Spark 运行速度比纯 Python 慢?性能比较

滚动大型数据集时,PyQt QTableView 速度非常慢

pve 管理网卡 速度慢

macOS home brew国内下载速度慢,替换清华大学源

MAVENmaven项目下载更新pom jar包速度慢 解决方案

如何加快熊猫数据框迭代