Numpy:从Pandas Dataframe中写入格式化二进制文件
在本文中,我们将介绍如何使用Numpy将Pandas Dataframe中的数据以二进制格式写入到文件中。Pandas和Numpy都是Python中很有用的数据处理和科学计算库,常常被用于数据的读写、处理、分析和可视化。Numpy数组是Numpy的一个重要数据结构,也是Pandas的基础,Pandas Dataframe则是基于Numpy数组和字典的一个二维数据结构,支持多种数据类型,具有更灵活的数据索引和操作方式。
要想将Pandas Dataframe中的数据写入文件,首先需要保存成Numpy数组,并制定二进制格式。Numpy可以使用np.save()函数将数组存储到硬盘中,也可以使用np.savetxt()函数将数组保存成文本格式,这些函数的参数都支持格式化指令,例如%d, %f, %.2f, %.3e等。但是,由于二进制格式更加紧凑和高效,适合大数据的存储和读取,我们这里将重点介绍如何使用np.ndarray.tofile()函数将Numpy数组以二进制格式写入到文件中。
阅读更多:Numpy 教程
1. 将Pandas Dataframe转为Numpy数组
首先通过Pandas库读取数据,并将其转换为Pandas Dataframe格式。例如,我们有一个包含学生姓名、性别、年龄、身高、体重等信息的数据集,存储在CSV文件中,我们可以用如下代码读取并预览:
import pandas as pd
df = pd.read_csv("students.csv")
print(df.head())
输出结果为:
Name Gender Age Height Weight
0 Tom M 18 176 70
1 Jack M 20 183 80
2 Jane F 19 165 55
3 Bob M 21 174 62
4 Lily F 20 169 53
对于Numpy数组,我们可以通过Pandas Dataframe的values属性来获取:
import numpy as np
ndarray = df.values
print(ndarray[:5])
输出结果为:
[['Tom' 'M' 18 176 70]
['Jack' 'M' 20 183 80]
['Jane' 'F' 19 165 55]
['Bob' 'M' 21 174 62]
['Lily' 'F' 20 169 53]]
2. 将Numpy数组写入二进制文件
接下来,我们需要将Numpy数组以二进制格式写入到文件中。这里我们将以’Name’、’Gender’、’Age’、’Height’、’Weight’五个字段的数据为例,先写成文本格式文件,再转换为二进制格式文件。
filename_txt = "students.txt"
filename_bin = "students.bin"
header = "Name\tGender\tAge\tHeight\tWeight\n"
with open(filename_txt, 'w') as f:
f.write(header)
np.savetxt(f, ndarray[:, :5], fmt='%s\t%s\t%d\t%.1f\t%.1f')
with open(filename_txt, 'r') as f_txt:
with open(filename_bin, 'wb') as f_bin:
f_bin.write(f_txt.read().encode('utf-8'))
上述代码中,我们首先以“Name\tGender\tAge\tHeight\tWeight\n”为表头,将Numpy数组中的前五列数据按指定格式用np.savetxt()函数保存成文本文件,再通过两层with语句,以二进制格式打开文本文件并写入到新的二进制文件中。其中编码方式统一为’utf-8’可以保证跨平台的一致性。
在生成的文本文件中,每行数据以“\t”分割,行尾以“\n”结束,即每个学生的信息占据一行。在Numpy数组的保存中,我们也指定了每个元素的数据类型和格式化指令,例如%s表示字符串,%d表示整数,%.1f表示保留一位小数的浮点数。这些格式化指令也可以根据实际需要进行修改。
而在二进制文件的写入过程中,由于Pandas Dataframe默认使用utf-8编码,所以需要将文本文件先进行编码才能正确写入到二进制文件中。而对于二进制文件的读取,则需要使用np.fromfile()函数从文件中读取数据,并指定数据类型和维度信息。
下面是读取二进制文件的示例代码:
with open(filename_bin, 'rb') as f_bin:
content = f_bin.read().decode('utf-8')
values = content.split('\n')[1:-1]
ndata = len(values)
dtype = np.dtype([('Name', 'S10'), ('Gender', 'S1'), ('Age', 'i4'),
('Height', 'f'), ('Weight', 'f')])
ndata_array = np.empty(ndata, dtype=dtype)
for i, line in enumerate(values):
values_list = line.split('\t')
ndata_array[i] = tuple(values_list)
print(ndata_array)
上述代码中,我们先以二进制方式打开文件并读取文件内容,使用decode()方法将二进制内容转换为字符串类型。根据文件内容中的“\n”分隔符对字符串进行切分,并去除首尾空白的无用数据。
接着,我们定义了一个自定义数据类型(dtype),指定了每个字段的名称、数据类型和字节长度。再针对数据行数定义了一个空数组,用于存储二进制文件中解析出来的数据。最后使用一个循环遍历values列表,将每个学生的信息转换为字典类型,再将其赋值给ndata_array数组中的相应字段即可。
总结
本文简要介绍了如何使用Numpy将Pandas Dataframe中的数据以二进制格式写入到文件中,包括将Pandas Dataframe转换为Numpy数组、以文本格式保存Numpy数组、将文本文件转换为二进制文件的写入操作,以及从二进制文件中读取数据的操作。二进制格式不仅更加紧凑和高效,也更具备平台和语言无关性,适合于大数据的存储、传输和处理。
在使用二进制文件存储数据时,还需要注意二进制格式的具体实现,例如字节长度、字节序、数据类型等方面的问题,在不同平台和语言之间都可能会存在差异,需要进行特殊处理。因此,在实际工程中,我们也需要根据数据的特点和应用场景,灵活选择数据的存储和读取方式,并进行适当的测试和验证。