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

使用Pandas读取CSV时解析字符串化数组字段的方法

问题描述

我有一个从包含数组字段的DataFrame导出的CSV文件,示例数据如下:

col1,col2,col3    
"[454.40145382, 254.9620727, 0.9147141790444601]",2.1299914162447497,-29.85771596074138

使用pd.read_csv读取该文件时,col1默认被解析为字符串。请问是否有标准方法可将这类字段尽可能解析为numpy数组?

另外,numpy是否有处理字符串数组的内置函数?我尝试使用np.fromstring时出现报错:

ValueError: string size must be a multiple of element size

我目前的临时解决方法如下(可修改为支持一维以上的递归形式):

data["col1_parsed"] = data["col1"].apply(lambda x: [float(e.strip().replace("[","").replace("]","")) for e in x.split(",")])

但该方法过于繁琐,我认为应该有现成的内置方案。

解决方案

方法一:读取CSV时直接指定解析规则

利用pd.read_csv的converters参数,给目标列绑定解析函数,一步完成数组转换:

方案1:结合ast.literal_eval(通用型,支持多维数组)

ast.literal_eval可以安全解析字符串形式的Python容器(列表、元组等),再转成numpy数组即可:

import ast
import pandas as pd
import numpy as np

def parse_to_np_array(s):
    return np.array(ast.literal_eval(s))

# 读取时直接解析col1
data = pd.read_csv("your_file.csv", converters={"col1": parse_to_np_array})

方案2:修正np.fromstring的使用方式

你之前报错是因为没清理字符串中的括号、也没指定分隔符,调整后即可正常解析:

import pandas as pd
import numpy as np

def parse_numpy_array(s):
    # 移除首尾的[],按逗号分割解析为numpy数组
    return np.fromstring(s.strip("[]"), sep=",", dtype=np.float64)

data = pd.read_csv("your_file.csv", converters={"col1": parse_numpy_array})

方法二:已读取CSV后的批量解析

如果已经完成CSV读取,也可以用apply批量处理目标列:

# 用ast.literal_eval方案
data["col1"] = data["col1"].apply(lambda x: np.array(ast.literal_eval(x)))

# 用numpy.fromstring方案
data["col1"] = data["col1"].apply(lambda x: np.fromstring(x.strip("[]"), sep=","))

关于numpy处理字符串数组的内置函数

numpy提供了多个内置函数处理字符串形式的数值序列,关键是匹配输入格式:

  • np.fromstring:需要输入的字符串是纯分隔符分隔的数值,不能包含括号等非数值字符,因此需要先清理字符串。
  • np.genfromtxt:可以直接从字符串读取数组,比如np.genfromtxt([s.strip("[]")], delimiter=","),功能和fromstring类似,但支持更复杂的分隔规则。

另外,np.array本身可直接接收Python列表,因此结合ast.literal_eval转成列表后再转numpy数组,是适配多维数组场景的更通用方案。

内容的提问来源于stack exchange,提问作者Layman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:52:33