如何保存Pandas单元格中的多维NumPy数组并保留原数据类型?
解决Pandas单元格中多维NumPy数组保存后转字符串的问题
问题场景
你的Pandas DataFrame中每个单元格存储的是多维NumPy数组:
df_data relationalAtt 0 [[0.87159, 0.88042, 0.88042, 0.81962, 0.81962,... 1 [[2.7428, 2.4265, 2.4265, 2.3447, 2.3447, 2.33... ... 275 rows × 1 columns
查看单个单元格的原始类型为NumPy数组:
df_data[df_data.columns[0]][0] # 输出: # array([[ 0.87159, 0.88042, ..., -0.64258], # [ 0.7453 , 0.82313, ..., 2.2079 ], # ...])
但保存为CSV/Excel后,数组会被转为字符串类型,读取后无法直接使用:
df_data.to_csv(path) df = pd.read_csv(path, index_col=0) df[df.columns[0]][0] # 输出为字符串: # '[[ 0.87159 0.88042 ... -0.64258]\n [ 0.7453 0.82313 ... 2.2079 ]\n ...]'
解决方案
1. 优先选择保留原始类型的存储格式
这类格式可以直接保存DataFrame的完整数据结构,无需转换:
- Pickle格式(轻量、易用)
# 保存 df_data.to_pickle("../Random_Data/" + name + ".pkl") # 读取 df = pd.read_pickle("../Random_Data/" + name + ".pkl") # 验证类型 print(type(df['relationalAtt'][0])) # <class 'numpy.ndarray'> - HDF5格式(适合大数据量,支持压缩)
# 保存 df_data.to_hdf("../Random_Data/" + name + ".h5", key='df', mode='w') # 读取 df = pd.read_hdf("../Random_Data/" + name + ".h5", key='df')
2. 将已保存的字符串转回NumPy数组
如果已经将数据存为CSV/Excel,可以通过字符串解析恢复数组:
import numpy as np import ast def str_to_numpy_array(s): # 清理字符串:移除省略号、换行,统一分隔符为逗号 cleaned = s.replace('...', '').replace('\n', ' ') cleaned = cleaned.replace(' ', ' ').strip().replace(' ', ',') try: # 尝试用ast解析为列表再转数组 arr_list = ast.literal_eval(cleaned) return np.array(arr_list) except: # 解析失败时,直接提取所有数字再reshape(需已知原数组形状) nums = list(map(float, [c for c in cleaned if c in '-.0123456789 '].split())) # 示例:假设原数组为N行6列,根据实际情况修改形状 return np.array(nums).reshape(-1, 6) # 批量转换 df['relationalAtt'] = df['relationalAtt'].apply(str_to_numpy_array)
3. 若必须使用CSV/Excel格式(不推荐)
可以将数组序列化为标准JSON字符串,避免解析错误:
import json # 保存时转为JSON字符串 df_data['relationalAtt'] = df_data['relationalAtt'].apply(json.dumps) df_data.to_csv(path) # 读取时解析回数组 df = pd.read_csv(path, index_col=0) df['relationalAtt'] = df['relationalAtt'].apply(lambda x: np.array(json.loads(x)))
内容的提问来源于stack exchange,提问作者Petros Tsialis
相关产品推荐
相关产品推荐

