【发布时间】:2019-08-19 15:19:15
【问题描述】:
我在大型数据集(1000 万行,6 列)上使用 Pandas pivot_table 函数。由于执行时间是最重要的,我试图加快这个过程。目前处理整个数据集大约需要 8 秒,这太慢了,我希望找到提高速度/性能的替代方法。
我当前的 Pandas 数据透视表:
df_pivot = df_original.pivot_table(index="industry", columns = "months",
values = ["orders", "client_name"],
aggfunc ={"orders": np.sum, "client_name": pd.Series.nunique})
df_original 包括所有数据(10m 行,从 csv 导入)。行业是客户的行业,月份是订单月份(1 月到 12 月),订单是订单数量。除订单数(int 数据类型)外,所有数据都转换为 categorical 数据。最初行业、月份和客户名称是字符串。
我尝试使用pandas.DataFrame.unstack - 速度更慢。我还尝试了Dask。 dask pivot_table 产生了一些改进(6 秒的执行时间 - 所以少了 2 秒)。但是,它仍然很慢。
有没有更快的替代方案(对于大型数据集)?也许用groupy、crosstab、... 重新创建数据透视表...不幸的是,我根本没有其他方法可以工作,而且我对 Python 和 Pandas 还是很陌生...
期待您的建议。提前致谢!
更新:
我通过以下方式找到了分组方式:
df_new = df_original.groupby(["months", "industry"]).agg({"orders": np.sum, "client_name": pd.Series.nunique}).unstack(level="months").fillna(0)
现在速度要快得多,大约需要 2-3 秒。还有一些选项可以进一步提高速度吗?
【问题讨论】:
-
你的执行环境是什么?多核、集群还是单台机器?大 RAM,还是大量快速磁盘访问?性能调优意味着知道您有哪些资源可供您使用。
-
你是对的,对不起!!单机,16GB RAM,8 核(i7-8650U CPU @ 1.90GHz)。我在我的 IDE (Visual Studio Code) 中运行代码。理想情况下,我的模块也应该在 RAM 较少(例如 8GB)和 CPU 功率较少的机器上“快速”运行......
-
OK下一个问题,数据是有序的吗?即您能否依靠要在数据透视中创建的拆分来反映在基础数据中?通过计时一些相对简单的函数来找到期望的下限也很有趣,只是为了看看最好的结果可能是什么样子。例如在不进行任何额外处理的情况下,将文件的每一行读入内存需要多长时间?
-
数据(即
orders的数量)未排序。应该是吗?它对性能有何帮助?我首先转换 csv 文件,然后将其转换为 HDF5 格式,以便在下次使用数据集时更快地加载。我不太担心将文件的每一行读入内存。也许我误解了你的问题...... -
我找到了
groupby的方式:df_new = df_original.groupby(["months", "industry"]).agg({"orders": np.sum, "client_name": pd.Series.nunique}).unstack(level="months").fillna(0)现在速度快了大约 2 秒。还有一些选项可以进一步提高速度吗?
标签: python pandas performance numpy dask