如何快速将pandas DataFrame进行数据处理?

18

使用Pandas内置方法还是pickle.dump更好呢?

标准的pickle方法如下:

pickle.dump(my_dataframe, open('test_pickle.p', 'wb'))

这是Pandas内置方法的样子:

my_dataframe.to_pickle('test_pickle.p')

为什么不对它们进行基准测试呢? - tolanj
1
@tolanj 你所说的基准测试是什么意思?我在下面的回答中包含了时间测量。 - tegan
对于那些需要一个漂亮的 panda.DataFrame 序列化基准测试的人:FastSerialization - Thomas Moreau
2
第一种方法更通用:想象一下您拥有自己的自定义文件系统和打开其中文件的库。在这种情况下,my_dataframe.to_pickle('my/weird/path')将无法工作,而pickle.dump(my_dataframe, my_weird_fs.open('/my/weird/path', 'wb'))将正常工作。 - Augustin
2个回答

20

感谢 @qwwqwwq,我发现 pandas 为数据框提供了内置的 to_pickle 方法。我进行了快速的时间测试:

In [1]: %timeit pickle.dump(df, open('test_pickle.p', 'wb'))
10 loops, best of 3: 91.8 ms per loop

In [2]: %timeit df.to_pickle('testpickle.p')
10 loops, best of 3: 88 ms per loop

所以看起来内置的功能只是略微好一些(对我来说这很有用,因为这意味着重构代码来使用内置的功能可能不值得)-希望这能帮助到某人!


你为什么关心处理时间?我认为功能更重要。to_pickle有额外的功能吗?只是不用导入pickle的方便吗? - endolith
19
虽然很晚了,但是我想说一句:对于非常大的数据框,无论使用哪种方法,写入时间(pickle.dump或者df.to_pickle)都差不多,但是使用df.to_pickle创建的文件读取时间要快得多。 使用timeit测试一个大小为53330行x 21列的数据框,使用pickle.dump写入的文件解压需要115毫秒,而使用df.to_pickle写入的文件只需要3毫秒。我不确定这个巨大的加速来自何处,但它是非常显著的。 - Zeph
谢谢你的添加,Tasha,非常有帮助。我真的很好奇为什么会存在速度差异,我本以为它们应该都得到相同的文件。 - verybadatthis

3

很容易进行基准测试,对吧?

enter image description here

实际上并没有任何区别,我期望Pandas会实现getstate,这样调用pickle.dump(df) 实际上就等同于调用 df.to_pickle()

如果你在Pandas源代码中搜索例如 __getstate__ ,你会发现它被实现在多个对象中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接