将Pandas系列列表转换为NumPy数组

6
我想将一个包含数字列表的 pandas Series 转换成 numpy 数组。我手头的数据如下所示:
ds = pd.Series(['[1 -2 0 1.2 4.34]', '[3.3 4 0 -1 9.1]'])

我的期望输出:

arr = np.array([[1, -2, 0, 1.2, 4.34], [3.3, 4, 0, -1, 9.1]])

我目前所做的是将 pandas 的 Series 转换为数字列表的 Series,代码如下:
ds1 = ds.apply(lambda x: [float(number) for number in x.strip('[]').split(' ')])

但我不知道如何从ds1转换为arr


你能保证系列中的列表具有相同数量的元素吗? - FBruzzesi
@FBruzzesi 是的。 - user7864386
2个回答

5

使用Series.str.strip+Series.str.split,并创建一个新的 np.array ,其 dtype=float

arr = np.array(ds.str.strip('[]').str.split().tolist(), dtype='float')

结果:

print(arr)

array([[ 1.  , -2.  ,  0.  ,  1.2 ,  4.34],
       [ 3.3 ,  4.  ,  0.  , -1.  ,  9.1 ]])

1
您可以先尝试从 Series 对象中删除 "[]",然后事情会变得更容易,https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.split.html
ds1 = ds.str.strip("[]")
# split and exapand the data, conver to numpy array
arr = ds1.str.split(" ", expand=True).to_numpy(dtype=float)

然后,arr 就是您想要的正确格式。
array([[ 1.  , -2.  ,  0.  ,  1.2 ,  4.34],
       [ 3.3 ,  4.  ,  0.  , -1.  ,  9.1 ]])

接着,我与Shubham的解决方案进行了简单的对比分析。

# Shubham's way
%timeit arr = np.array(ds.str.strip('[]').str.split().tolist(), dtype='float')
332 µs ± 5.72 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# my way
%timeit ds.str.strip("[]").str.split(" ", expand=True).to_numpy(dtype=float)
741 µs ± 4.21 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

显然,他的解决方案要快得多!干杯!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接