Pandas 将数据帧转换为类似字节的对象

Pandas 将数据帧转换为类似字节的对象,pandas,binary,pickle,bytesio,Pandas,Binary,Pickle,Bytesio,嗨,我正在尝试将我的df转换为二进制,并将其存储在一个变量中 我的朋友: df = pd.DataFrame({'A':[1,2,3],'B':[4,5,6]}) 我的代码: import io towrite = io.BytesIO() df.to_excel(towrite) # write to BytesIO buffer towrite.seek(0) # reset pointer 我得到的AttributeError:“\u io.BytesIO”对象没有属

嗨,我正在尝试将我的df转换为二进制,并将其存储在一个变量中

我的朋友:

 df = pd.DataFrame({'A':[1,2,3],'B':[4,5,6]})
我的代码:

 import io
 towrite = io.BytesIO()
 df.to_excel(towrite)  # write to BytesIO buffer
 towrite.seek(0)  # reset pointer
 
我得到的
AttributeError:“\u io.BytesIO”对象没有属性“write\u cells”

完全回溯:

AttributeError                            Traceback (most recent call last)
<ipython-input-25-be6ee9d9ede6> in <module>()
      1 towrite = io.BytesIO()
----> 2 df.to_excel(towrite)  # write to BytesIO buffer
      3 towrite.seek(0)  # reset pointer
      4 encoded = base64.b64encode(towrite.read())  #

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py in to_excel(self, excel_writer, sheet_name, na_rep, float_format, columns, header, index, index_label, startrow, startcol, engine, merge_cells, encoding, inf_rep, verbose, freeze_panes)
   1422         formatter.write(excel_writer, sheet_name=sheet_name, startrow=startrow,
   1423                         startcol=startcol, freeze_panes=freeze_panes,
-> 1424                         engine=engine)
   1425 
   1426     def to_stata(self, fname, convert_dates=None, write_index=True,

C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\formats\excel.py in write(self, writer, sheet_name, startrow, startcol, freeze_panes, engine)
    624 
    625         formatted_cells = self.get_formatted_cells()
--> 626         writer.write_cells(formatted_cells, sheet_name,
    627                            startrow=startrow, startcol=startcol,
    628                            freeze_panes=freeze_panes)

AttributeError: '_io.BytesIO' object has no attribute 'write_cells'
AttributeError回溯(最近一次调用)
在()
1 towrite=io.BytesIO()
---->2 df.to_excel(towrite)#写入字节缓冲区
3 towrite.seek(0)#重置指针
4 encoded=base64.b64编码(towrite.read())#
C:\ProgramData\Anaconda3\lib\site packages\pandas\core\frame.py in to_excel(self、excel_writer、sheet_name、na_rep、float_格式、列、标题、索引、索引标签、startrow、startcol、引擎、合并单元格、编码、inf_rep、详细、冻结窗格)
1422 formatter.write(excel\u writer,工作表名称=工作表名称,startrow=startrow,
1423 startcol=startcol,冻结窗格=冻结窗格,
->1424发动机=发动机)
1425
1426 def to_stata(self,fname,convert_dates=None,write_index=True,
C:\ProgramData\Anaconda3\lib\site packages\pandas\io\formats\excel.py写入(self、writer、sheet\u name、startrow、startcol、冻结窗格、引擎)
624
625格式化的\u单元格=自身。获取格式化的\u单元格()
-->626写入器。写入单元(格式化单元、工作表名称、,
627 startrow=startrow,startcol=startcol,
628冻结窗格=冻结窗格)
AttributeError:“\u io.BytesIO”对象没有属性“write\u cells”

我通过将pandas升级到新版本解决了这个问题

 import io
 towrite = io.BytesIO()
 df.to_excel(towrite)  # write to BytesIO buffer
 towrite.seek(0) 
 print(towrite)
 b''
 print(type(towrite))
 _io.BytesIO
如果要查看类似object的字节,请使用
getvalue

print(towrite.getvalue())
b'PK\x03\x04\x14\x00\x00\x00\x08\x00\x00\x00!\x00<\xb
print(towrite.getvalue())
b'PK\x03\x04\x14\x00\x00\x00\x08\x00\x00\x00\x00!\x00Pickle
是熊猫数据帧的一种可复制格式,但它仅用于受信任用户之间的内部使用。出于安全原因,它不用于与不受信任的用户共享

导入pickle
#出口:
my_bytes=pickle.dumps(df,协议=4)
#进口:
df_restored=pickle.load(my_字节)
这是用Pandas 1.1.2测试的。不幸的是,对于一个非常大的数据帧,这失败了,但接下来的工作是分别对每个列进行pickle和并行压缩,然后再对该列表进行pickle。或者,您可以对大数据帧的块进行pickle

CSV 如果必须使用CSV表示形式:

df.to_csv(index=False).encode()
请注意,使用CSV时会丢失各种数据类型

拼花地板 请参阅。注意,使用拼花地板时会转换各种数据类型

擅长
大部分情况下避免使用它,因为它限制了您的代码。

我只是测试了您的代码,并在windows.jezrael下的pandas 0.23.4中工作得很好。当我打印(towrite)时,它只打印
b'
为什么不
b'/x0/…'
我需要返回二进制数据,我如何才能得到它it@pyd-我通过
df=pd.read\u excel(towrite)对其进行测试
然后返回数据帧。可能是python的问题吗?我在python 3.6I下测试了它,通过
towrite.getvalue()解决了它
,感谢您的帮助@jezraelBe非常小心地使用Excel格式,因为它限制了数据的使用。其他各种格式没有这样的限制。谢谢。我一直允许用户保存一份数据类型的目录,但在阅读本文后,我将改为使用拼花地板