You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何保存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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 06:17:43