可以以“追加模式”将pandas DataFrame保存为二进制吗?
有没有办法把一个 pandas 的数据框(DataFrame)以二进制格式保存,并且可以用“追加”模式,就像在 to_csv() 方法中使用 mode='a' 一样?这样做会很方便:
df.save( path = 'myFrame', mode = 'a' )
根据下面的建议,我选择了:
def pdAppendPickle( data, path ):
""" Intent: append pickle containing dataframe """
with open( path, 'a' ) as f:
pkl.dump( data, f )
不过,遗憾的是,这个方法和 pd.load() 不能一起用,也和 pd.save() 不一样,因为我们并不是在合并数据。我们需要用类似这样的方式:
def pdLoadPickles( path ):
""" Load one or more pickles containing dataframes and concatenate """
f = open( path, 'r' )
dfs = list()
while True:
try:
df = pkl.load( f )
dfs.append( df )
except:
break
f.close()
return pd.concat( dfs, axis = 0 )
如果有人有一个优雅的解决方案,真正能实现 pd.save() 的增量版本,我还是很想看看。
1 个回答
2
你可以直接使用 pickle
或 cPickle
来实现这个功能:
In [78]: import cPickle as pkl
In [79]: df = DataFrame(randint(5, size=(5, 2)))
In [80]: df
Out[80]:
0 1
0 3 2
1 4 1
2 0 3
3 0 0
4 4 1
In [81]: df2 = DataFrame(randint(5, size=(5, 2)))
In [82]: df2
Out[82]:
0 1
0 2 1
1 1 0
2 1 0
3 0 0
4 1 3
In [83]: with open('appended.pkl', 'a') as f:
....: pkl.dump(df, f)
....:
In [84]: with open('appended.pkl', 'a') as f:
....: pkl.dump(df2, f)
....:
In [85]: f = open('appended.pkl', 'r')
In [86]: pkl.lo
pkl.load pkl.loads
In [86]: pkl.load(f)
Out[86]:
0 1
0 3 2
1 4 1
2 0 3
3 0 0
4 4 1
In [87]: pkl.load(f)
Out[87]:
0 1
0 2 1
1 1 0
2 1 0
3 0 0
4 1 3