我需要序列化 DataFrame 并通过网络发送它们。出于安全原因,我不能使用泡菜。
下一个最快的方法是什么?我对 v0.13 中的 msgpacks 很感兴趣,但除非我做错了什么,否则性能似乎比 pickle 差得多。
In [107]: from pandas.io.packers import pack
In [108]: df = pd.DataFrame(np.random.rand(1000, 100))
In [109]: %timeit buf = pack(df)
100 loops, best of 3: 15.5 ms per loop
In [110]: import pickle
In [111]: %timeit buf = pickle.dumps(df)
1000 loops, best of 3: 241 µs per loop
到目前为止,我发现的最好的方法就是使用 array.tostring() 序列化同质 numpy 数组(df.as_blocks() 很方便)并从中重建 DataFrame。性能可与泡菜媲美。
但是,使用这种方法,我被迫将 dtype=object 的列(即,至少有一个字符串的任何内容)转换为完全字符串,因为 Numpy 的 fromstring() 无法反序列化 dtype=object。Pickle 设法在对象列中保留混合类型(它似乎在 pickle 输出中包含一些功能)。