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



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

my_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: '_io.BytesIO' object has no attribute 'write_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:ProgramDataAnaconda3libsite-packagespandascoreframe.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:ProgramDataAnaconda3libsite-packagespandasioformatsexcel.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'

我通过将熊猫升级到较新版本来解决这个问题。

import io
towrite = io.BytesIO()
df.to_excel(towrite)  # write to BytesIO buffer
towrite.seek(0) 
print(towrite)
b''
print(type(towrite))
_io.BytesIO

如果你想看到类似字节的对象使用getvalue

print(towrite.getvalue())
b'PKx03x04x14x00x00x00x08x00x00x00!x00<xb

泡菜

Pickle 是 Pandas 数据帧的可重现格式,但它仅供受信任用户内部使用。出于安全原因,它不适用于与不受信任的用户共享。

import pickle
# Export:
my_bytes = pickle.dumps(df, protocol=4)
# Import:
df_restored = pickle.loads(my_bytes)

这是用Pandas 1.1.2测试的。不幸的是,这对于非常大的数据帧失败了,但是有效的方法是单独酸洗和并行压缩每一列,然后酸洗此列表。或者,您可以泡菜大型数据帧的块。

.CSV

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

df.to_csv(index=False).encode()

请注意,使用 CSV 时会丢失各种数据类型。

木条镶花之地板

看到这个答案。请注意,使用镶木地板时会转换各种数据类型。

胜过

在大多数情况下避免使用它,因为它限制了最大行数和列数。

我需要通过不接受熊猫字节对象的 boto3 将文件对象上传到 S3。 因此,基于Asclepius的答案,我将对象转换为BytesIO,例如:

from io import BytesIO  
data = BytesIO(df.to_csv(index=False).encode('utf-8'))

相关内容

  • 没有找到相关文章

最新更新