重新加载数据时如何保留numpy数组的数据类型?
问题:保存含NumPy数组的DataFrame时保留原数据类型
假设你创建了包含NumPy数组列的DataFrame:
import numpy as np import pandas as pd data = {'col_1': [np.array([1,2,3])], 'col_2': 3} x = pd.DataFrame.from_dict(data)
随后将其写入CSV文件,再重新导入:
filename = 'test.csv' x.to_csv(filename) x2 = pd.read_csv('test.csv')
此时打印该NumPy数组的类型:
print(type(x2.iloc[0,2]))
返回结果是<class 'str'>而非NumPy数组。请问能否避免这种情况保留NumPy数组类型?比如使用Pickle替代CSV?或者写入文件后重新加载时数据类型总会丢失?
解决方案
CSV无法直接保留NumPy数组类型:CSV是纯文本格式,会把所有非基础数据类型(包括NumPy数组)自动转换成字符串存储,重新读取时只能解析为字符串,没法自动还原成NumPy数组。如果非要用CSV,得手动做序列化和反序列化:存的时候把数组转成统一格式的字符串(比如
np.array2string(arr, separator=',')),读的时候再用np.fromstring解析成数组,但这种方法麻烦,还容易在数组结构复杂时出错,不推荐。用Pickle直接保存DataFrame:这是最直接的方案,Pickle是Python的序列化格式,能完整保留对象的所有类型信息,包括DataFrame里的NumPy数组。使用方法很简单:
# 保存 x.to_pickle('test.pkl') # 读取 x2 = pd.read_pickle('test.pkl') # 验证类型 print(type(x2.iloc[0,1])) # 返回 <class 'numpy.ndarray'>注意:Pickle仅适用于Python环境,跨语言兼容性差,且不要加载来源不明的Pickle文件,存在安全风险。
其他替代格式:
- Feather:专为Python/R设计的快速序列化格式,支持保留复杂数据类型,读写速度快,适合小到中等数据量的跨语言场景。
- Parquet:列式存储格式,压缩率高,适合大数据场景,同样能完整保留数据类型。
这些二进制格式都能直接保留NumPy数组的类型,不需要手动转换。
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

