【发布时间】:2015-12-04 11:30:30
【问题描述】:
我有一个 csv 文件,其中一列是以分号分隔的可变长度浮点数列表。例如:
Index List
0 900.0;300.0;899.2
1 123.4;887.3;900.1;985.3
当我将其读入 pandas DataFrame 时,该列的数据类型是对象。我想将它转换为一个 numpy 数组(或者只是一个常规的浮点数组,在这个阶段并不重要)。
我写了一个小函数,它采用其中一个列表元素并将其转换为一个 numpy 数组:
def parse_list(data):
data_list = data.split(';')
return np.array(map(float, data_list))
这很好用,但我想做的是直接在DataFrame中进行这种转换,这样我就可以在转换后使用pandasql等来操作整个数据集。有人能指出我正确的方向吗?
编辑:我似乎问得不好。我想转换以下数据框:
Index List
0 900.0;300.0;899.2
1 123.4;887.3;900.1;985.3
其中 List 的 dtype 是 'object'
到以下数据框:
Index List
0 [900.0, 300.0, 899.2]
1 [123.4, 887.3, 900.1, 985.3]
List 的数据类型是 numpy 浮点数组
EDIT2:由于第一个答案,取得了一些进展。我现在有这条线:
df['List'] = df['List'].str.split(';')
将列拆分为一个数组,但当我尝试这样做时,dtypes 仍然是对象
df['List'] = df['List'].astype(float)
我得到错误: 返回 arr.astype(dtype) ValueError: 使用序列设置数组元素。
【问题讨论】:
-
你想要一个他值的单个 np 数组还是一个新的 df OK
df['List'].str.split(';', expand=True).astype(np.float64) -
当您说到位时,您只是想将
str转换为float? -
这很难到位,因为pandas会在
apply之后扩展结构 -
pandas 不适合将每个单元格的数据转换为类似数组的类型,在 ctor 中这样做会更容易,它会尝试做一些巧妙的解包,所以你必须做 fugly黑客
-
关于你的最后一个错误,你所做的只是生成一个拆分字符串的列表,你仍然需要将每个元素转换为一个浮点数,这就是为什么我这样做了
expand=True允许我使用astype转换结果 df dtype
标签: python-2.7 csv numpy pandas