现在,每次运行脚本时,我都会导入一个相当大的CSV作为数据框架。是否有一个好的解决方案来保持数据帧在运行之间不断可用,这样我就不必花费所有的时间等待脚本运行?


当前回答

您可以使用羽毛格式的文件。它非常快。

df.to_feather('filename.ft')

其他回答

虽然已经有一些答案,我找到了一个很好的比较,他们尝试了几种方法来序列化熊猫数据框架:有效地存储熊猫数据框架。

他们比较:

pickle:原始ASCII数据格式 cPickle,一个C库 Pickle-p2:使用更新的二进制格式 Json: standardlib Json库 json-no-index:类似json,但没有索引 msgpack:二进制JSON替代品 CSV hdfstore: HDF5存储格式

在他们的实验中,他们序列化了一个包含1,000,000行的DataFrame,并分别测试了两列:一列是文本数据,另一列是数字。他们的免责声明说:

您不应该相信以下内容适用于您的数据。您应该查看自己的数据并自己运行基准测试

他们提到的测试源代码可以在网上找到。由于这段代码不能直接工作,我做了一些小更改,您可以在这里看到:serialize.py 我得到了以下结果:

他们还提到,通过将文本数据转换为分类数据,序列化速度要快得多。在他们的测试中,大约是10倍的速度(另见测试代码)。

编辑:pickle的时间比CSV的时间长可以用所使用的数据格式来解释。默认情况下,pickle使用可打印的ASCII表示,这会生成更大的数据集。然而,从图中可以看出,使用更新的二进制数据格式(版本2,pickle-p2)的pickle加载时间要短得多。

其他参考资料:

在“最快的Python库来读取CSV文件”这个问题中,有一个非常详细的答案,它比较了不同的库来读取CSV文件的基准。结果是,对于读取csv文件,numpy.fromfile是最快的。 另一个序列化测试 显示msgpack, usjson和cPickle在序列化中是最快的。

泡菜很好!

import pandas as pd
df.to_pickle('123.pkl')    #to save the dataframe, df to 123.pkl
df1 = pd.read_pickle('123.pkl') #to load 123.pkl back to the dataframe df

如前所述,有不同的选项和文件格式(HDF5, JSON, CSV, parquet, SQL)来存储数据帧。然而,pickle不是一级公民(取决于你的设置),因为:

泡菜是一个潜在的安全隐患。形成pickle的Python文档:

警告pickle模块不安全 恶意构造的数据。对象接收的数据永远不能解pickle 不受信任或未经身份验证的源。

泡菜很慢。找到这里和这里的基准。

根据您的设置/使用情况,这两个限制都不适用,但我不建议将pickle作为pandas数据帧的默认持久性。

您可以使用羽毛格式的文件。它非常快。

df.to_feather('filename.ft')

to_pickle()的另一个非常新鲜的测试。

我总共有25个.csv文件要处理,最终的数据框架由大约2M项组成。

(注意:除了加载.csv文件,我还操作了一些数据,并通过新列扩展数据帧。)

浏览所有25个.csv文件并创建dataframe大约需要14秒。

从pkl文件加载整个数据帧的时间不到1秒