是时候告别 pd.read_csv() 和 pd.to_csv()
It’s Time to Say GoodBye to pd.read_csv() and pd.to_csv()
Discussing another major caveat of Pandas
Avi Chawla Published in Towards Data Science May 27, 2022
Pandas 到 CSV 的输入输出操作是序列化的,这使得它们极其低效且耗时。当我在这里看到足够的并行化范围时,我感到很沮丧,但不幸的是,Pandas 还没有提供此功能。尽管我从一开始就不赞成使用 Pandas 创建 CSV(请阅读下面的文章了解原因),但我知道在某些情况下,人们别无选择,只能使用 CSV。
因此,在这篇文章中,我们将探讨Dask和DataTable,这是数据科学家最流行的两个类似 Pandas 的库。我们将根据 Pandas、Dask 和 Datatable 在以下参数上的表现对它们进行排名:
- 读取 CSV 并获取 PANDAS DATAFRAME 所需的时间
如果我们通过 Dask 和 DataTable 读取 CSV,它们将分别生成 Dask DataFrame 和 DataTable DataFrame,而不是 Pandas DataFrame。假设我们想坚持传统的 Pandas 语法和函数(由于熟悉),我们必须首先将它们转换为 Pandas DataFrame,如下所示。
2.将 PANDAS DATAFRAME 存储到 CSV 所需的时间
目标是从给定的 Pandas DataFrame 生成 CSV 文件。对于 Pandas,我们已经知道df.to_csv()方法。但是,要从 Dask 和 DataTable 创建 CSV,我们首先需要将给定的 Pandas DataFrame 转换为各自的 DataFrame,然后将它们存储在 CSV 中。因此,我们还将在此分析中考虑此 DataFrame 转换所需的时间。
实验装置:
- 出于实验目的,我在 Python 中生成了一个随机数据集,其中包含可变行和 30 列 — 包含字符串、浮点和整数数据类型。
- 我将下面描述的每个实验重复五次,以减少随机性并从观察到的结果中得出公正的结论。我在下一节中报告的数字是五个实验的平均值。
- Python环境和库:
- Python 3.9.12
- 熊猫1.4.
- 数据表1.0.0
- 达克 2022.02.1
实验 1:读取 CSV 所需的时间
下图描述了 Pandas、Dask 和 DataTable 读取 CSV 文件并生成 Pandas DataFrame 所花费的时间(以秒为单位)。CSV 的行数范围从 10 万到 500 万。
- 实验结果表明,当行数少于一百万时,Dask 和 Pandas 从 CSV 生成 Pandas DataFrame 所需的时间大致相同。
- 然而,当我们超过一百万行时,Dask 的性能就会恶化,生成 Pandas DataFrame 所需的时间比 Pandas 本身要多得多。
- 在这两种情况下,Datatable 在 Pandas 中生成 DataFrame 所需的时间最短,可提供高达 4 到 5 倍的加速 - 使其成为迄今为止最好的选择。
实验 2:保存到 CSV 所需的时间
下图描述了 Pandas、Dask 和 DataTable 从给定的 Pandas DataFrame 生成 CSV 文件所花费的时间(以秒为单位)。行数范围从 100k 到 500 万。
- 在所有情况下,将 Pandas DataFrame 存储到 CSV 时,Dask 的表现都比 Pandas 差。
- 与实验 1 类似,DataTable 表现最好——相对于 Pandas,保存过程提高了近8 倍。
结束语
老实说,我不太喜欢 CSV。如果您仔细阅读了我之前的文章(我在上面链接或您可以在此处阅读)和您现在正在阅读的文章,您可能也会与我产生共鸣。自从我发现了与 CSV 相关的众多问题以来,我已尽可能停止使用它们。
总而言之,我想说,除非您需要在 Excel 等非 Python 环境之外查看 DataFrame,否则您根本不需要 CSV。首选 Parquet、Feather 或 Pickle 等格式来存储 DataFrame。不过,如果您没有其他选择,至少可以利用 DataTable 而不是 Pandas 来优化您的输入和输出操作。
Written by Avi Chawla
10.7K Followers
·
Writer for
Towards Data Science
👉 Get a Free Data Science PDF (250+ pages) with 200+ tips by subscribing to my daily newsletter today: https://bit.ly/DailyDS.