使用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
相关产品推荐
相关产品推荐

