两者都是用于数据分析系统的柱状(磁盘)存储格式.两者都集成在Apache Arrow(用于python的pyarrow包)中,旨在与Arrow对应作为柱状内存分析层.
两种格式有何不同?
在可能的情况下,你是否总是喜欢使用羽毛?
附录
我在这里找到了一些提示https://github.com/wesm/feather/issues/188,但考虑到这个项目的年龄,它可能有点过时了.
不是一个严肃的速度测试,因为我只是倾倒并加载一个完整的Dataframe,但如果您之前从未听说过这些格式,那么会给您一些印象:
# IPython
import numpy as np
import pandas as pd
import pyarrow as pa
import pyarrow.feather as feather
import pyarrow.parquet as pq
import fastparquet as fp
df = pd.DataFrame({'one': [-1, np.nan, 2.5],
'two': ['foo', 'bar', 'baz'],
'three': [True, False, True]})
print("pandas df to disk ####################################################")
print('example_feather:')
%timeit feather.write_feather(df, 'example_feather')
# 2.62 ms ± 35.8 µs per loop …Run Code Online (Sandbox Code Playgroud) msgpack在熊猫应该是一个替代品pickle.
这是一种轻量级的可移植二进制格式,类似于二进制JSON,具有很高的空间效率,并且在写入(序列化)和读取(反序列化)方面都提供了良好的性能.
然而,我发现它的性能似乎与咸菜不相上下.
df = pd.DataFrame(np.random.randn(10000, 100))
>>> %timeit df.to_pickle('test.p')
10 loops, best of 3: 22.4 ms per loop
>>> %timeit df.to_msgpack('test.msg')
10 loops, best of 3: 36.4 ms per loop
>>> %timeit pd.read_pickle('test.p')
100 loops, best of 3: 10.5 ms per loop
>>> %timeit pd.read_msgpack('test.msg')
10 loops, best of 3: 24.6 ms per loop
Run Code Online (Sandbox Code Playgroud)
问题: 除了泡菜的潜在安全问题,msgpack对pickle有什么好处?pickle仍然是序列化数据的首选方法,还是目前存在更好的替代方案?
我想将具有不同列的dataFrame存储到hdf5文件中(查找下面带有数据类型的摘录).
In [1]: mydf
Out [1]:
endTime uint32
distance float16
signature category
anchorName category
stationList object
Run Code Online (Sandbox Code Playgroud)
在转换一些列(我上面的摘录中的signature和anchorName)之前,我使用了类似下面的代码来存储它(它工作得非常好):
path = 'tmp4.hdf5'
key = 'journeys'
mydf.to_hdf(path, key, mode='w', complevel=9, complib='bzip2')
Run Code Online (Sandbox Code Playgroud)
但它不适用于类别,然后我尝试了以下:
path = 'tmp4.hdf5'
key = 'journeys'
mydf.to_hdf(path, key, mode='w', format='t', complevel=9, complib='bzip2')
Run Code Online (Sandbox Code Playgroud)
它工作正常,如果我删除列stationList,其中每个条目是一个字符串列表.但是在本专栏中,我得到以下异常:
Cannot serialize the column [stationList] because
its data contents are [mixed] object dtype
Run Code Online (Sandbox Code Playgroud)
如何改进我的代码以存储数据框?
pandas版本:0.17.1
python版本:2.7.6(由于兼容性原因无法更改)
edit1(一些示例代码):
import pandas as pd
mydf = pd.DataFrame({'endTime' : pd.Series([1443525810,1443540836,1443609470]),
'distance' : pd.Series([454.75,477.25,242.12]),
'signature' : pd.Series(['ab','cd','ab']),
'anchorName' : pd.Series(['tec','ing','pol']),
'stationList' : pd.Series([['t1','t2','t3'],['4','t2','t3'],['t3','t2','t4']]) …Run Code Online (Sandbox Code Playgroud)