从 Pandas Dataframe 写入格式化的二进制文件

问题描述 投票:0回答:2

我已经看到了一些将 Python 中的格式化二进制文件读取到 Pandas 的方法, 也就是说,我正在使用这段代码,该代码使用 NumPy fromfile 读取,该文件格式为使用 dtype 给出的结构。

import numpy as np
import pandas as pd

input_file_name = 'test.hst'

input_file = open(input_file_name, 'rb')
header = input_file.read(96)

dt_header = np.dtype([('version', 'i4'),
                      ('copyright', 'S64'),
                      ('symbol', 'S12'),
                      ('period', 'i4'),
                      ('digits', 'i4'),
                      ('timesign', 'i4'),
                      ('last_sync', 'i4')])

header = np.fromstring(header, dt_header)

dt_records = np.dtype([('ctm', 'i4'),
                       ('open', 'f8'),
                       ('low', 'f8'),
                       ('high', 'f8'),
                       ('close', 'f8'),
                       ('volume', 'f8')])
records = np.fromfile(input_file, dt_records)

input_file.close()

df_records = pd.DataFrame(records)
# Now, do some changes in the individual values of df_records
# and then write it back to a binary file

现在,我的问题是如何将其写回新文件。我在 NumPy 中找不到任何函数(在 Pandas 中也没有),它允许我准确指定要在每个字段中写入的字节。

python numpy pandas binaryfiles
2个回答
10
投票

Pandas 现在提供多种格式

Format Type Data Description     Reader         Writer
text        CSV                  read_csv       to_csv
text        JSON                 read_json      to_json
text        HTML                 read_html      to_html
text        Local clipboard      read_clipboard to_clipboard
binary      MS Excel             read_excel     to_excel
binary      HDF5 Format          read_hdf       to_hdf
binary      Feather Format       read_feather   to_feather
binary      Parquet Format       read_parquet   to_parquet
binary      Msgpack              read_msgpack   to_msgpack
binary      Stata                read_stata     to_stata
binary      SAS                  read_sas    
binary      Python Pickle Format read_pickle    to_pickle
SQL         SQL                  read_sql       to_sql
SQL         Google Big Query     read_gbq       to_gbq

对于中小型文件,我更喜欢 CSV,因为格式正确的 CSV 可以存储任意字符串数据,是人类可读的,并且在实现前两个目标的同时与任何格式一样简单。

不幸的是,对于更复杂的问题,选择更困难。

对于下载网络权重,如果提供“safetensor”格式,“我推荐”。 (您仍然需要信任加载安全张量的模型代码。)有关安全张量历史的更多信息,请参阅下面对 pickle 格式的讨论。

如果我在亚马逊AWS上,我会考虑使用镶木地板。 但是,我对这种格式没有任何经验。

我“不建议使用

tofile()
”。
tofile()
最适合快速文件存储,您不希望文件在数据可能具有不同字节序(大/小字节序)的不同机器上使用。

我“不再喜欢 HDF5 格式”。由于它“相当复杂”,因此长期归档存在严重风险。它有 150 页的规范,只有一个 300,000 行 C 实现。 我也可以“不再喜欢泡菜”格式。 尽管

pickle 格式声称具有长期稳定性

,但它允许执行任意代码。即使 pickle 中实际上没有存储任何代码,所有 pickles 都会执行代码只是为了解开它们,这就是为什么 Huggingface 的人们首先推荐使用 pickle-tools 来扫描 pickle,然后使用 safetensor 作为 pickles 的替代品. 如果您对保存自己数据的稳定、安全的二进制格式有任何建议,请分享! 与此同时,我认为针对小数据的 CSV 以及在需要时节省磁盘空间或网络带宽的压缩 CSV 可能是最好的方法。 如果可能的话,我个人会尽量避免任何需要纯文本以上存储的 pandas 格式。


6
投票
DataFrame

是视图还是副本,但假设它是副本,您可以使用

to_records
DataFrame
 方法。
这会返回一个记录数组,然后您可以使用

tofile

将其放入磁盘。


例如

df_records = pd.DataFrame(records) # do some stuff new_recarray = df_records.to_records() new_recarray.tofile("myfile.npy")

数据将以打包字节的形式驻留在内存中,其格式由重组数据类型描述。

© www.soinside.com 2019 - 2024. All rights reserved.