可以以“追加模式”将pandas DataFrame保存为二进制吗?

2 投票
1 回答
3217 浏览
提问于 2025-04-18 06:33

有没有办法把一个 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

你可以直接使用 picklecPickle 来实现这个功能:

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

撰写回答