哪个更好/优化:csv.Dictreader 还是 pandas.read_csv?

问题描述 投票:0回答:2

我尝试将

18.6mb csv file
(其中包含数千行,每行大约数百列)读入 python 中的变量。对于以后的文件分析是必要的。因此,当读取器生成器工作时,我无法读取和分析行。我需要一个变量中的所有行。不过,这不是主题。

主题是两种方法的区别。我尝试过

pandas.read_csv
csv.DictReader
。我认为 pandas dataframe 会更有用,只要这主要是数据分析库。但使用字典对我来说很舒服,因为我现在正在实时学习 pandas。 但是,当我比较数据帧的大小和字典列表的大小(来自
csv.DictWriter
)时,结果有点出乎意料。

这是代码:

import csv
from pandas import read_csv
from pympler import asizeof


data = read_csv('/home/mika/1_Mika/Project/Python/log_analyser/logs/RTD - [2023.08.17] - [16:29:06].csv')
print('pandas.read_csv:', asizeof.asizeof(data))

data = []
with open('/home/mika/1_Mika/Project/Python/log_analyser/logs/RTD - [2023.08.17] - [16:29:06].csv') as fp:
    reader = csv.DictReader(fp, delimiter=",")
    for row in reader:
        data.append(row)
print(' csv.DictReader:', asizeof.asizeof(data))

这是 18.6 mb 文件的输出:

pandas.read_csv dataframe       :  26531448 bytes
csv.DictReader list_with_dicts  :  112705688 bytes

我想,那个字典比 pandas dataframe 更轻,只要它是 python 等的原生类型即可。

那么,从长远来看,pandas 和字典将如何工作?哪个更适合未来的数据分析? 在 python 中读取/写入/处理大型 csv 文件最流畅和最有利的方式是什么?

python pandas csv memory profiling
2个回答
0
投票

如果你确实有很多大的csv需要处理,建议使用hadoop或pyspark


0
投票

虽然字典通常比 Pandas 数据帧更节省内存,但您所看到的差异有一些原因:

  • 数据类型转换:当您使用pandas.read_csv时,Pandas会执行自动数据类型推断和转换,根据列的实际数据类型优化内存使用。相反,当您使用 csv.DictReader 时,数据默认存储为字符串,导致内存占用较高。

  • 内部数据结构:Pandas 使用更复杂的内部数据结构,与简单字典相比,可以优化内存使用。 Pandas 数据帧结合使用 NumPy 数组和其他优化的数据结构来实现高效存储和操作。

  • 列标题: 在 csv.DictReader 中,每一行都存储为字典,其中键是列标题。与 Pandas 数据帧相比,这些额外的信息增加了内存使用量,其中列名的存储效率更高。

  • 其他元数据:Pandas 数据帧存储其他元数据和优化,例如索引和对齐信息,这可能会影响内存使用。

考虑到您的情况以及未来数据分析的目标,以下是一些注意事项:

  • 内存使用:如果内存效率是一个关键问题,并且您喜欢使用字典,那么 csv.DictReader 在读取大型 CSV 文件时可能会更节省内存。还可以考虑在读取后转换列的数据类型,进一步优化内存使用。

  • 数据分析:如果您正在学习并计划执行数据分析,Pandas 提供了一系列用于数据操作、分析和可视化的强大工具。它还提供了与数据科学生态系统中常用的其他库更好的集成。

  • 数据操作:与字典相比,Pandas 提供了更方便的方法来执行过滤、聚合、分组和连接等操作。在处理复杂的数据分析任务时,这些操作可以更加高效和富有表现力。

  • 文件写入:将大型数据集写回 CSV 时,您可能需要考虑使用 csv.DictWriter 或 Pandas 的 to_csv 方法以及自定义的节省内存的数据类型转换。

  • 高效读取:如果您需要处理非常大的CSV文件,请考虑以较小的块或批次处理它们,以避免一次将整个数据集加载到内存中。这可以使用 pandas.read_csv 和 chunksize 参数来实现。

我个人建议熟悉 Pandas,因为它们提供了许多用于数据分析和操作的出色工具,但最终选择使用 Pandas 数据框还是字典取决于您的具体用例、您对工具的舒适程度以及交易-您愿意在内存使用、分析简易性和性能方面做出的调整。

© www.soinside.com 2019 - 2024. All rights reserved.