python - 将 pandas 系列字符串整数转换为 numpy 矩阵 - 高效

标签 python pandas numpy

我有一个 pandas 系列,每个单元格包含一串整数(每个字符串中的整数数量相同,用空格分隔),例如

s = pd.Series(['1 17 -3 ... n'],['100 -27 344 ... n'],...,['0 14 2 ... n'])

我知道如何将单个单元格转换为 numpy 向量:

arr = np.asarray(s[0].split(' '), dtype = np.float32)

我还知道如何将整个系列转换为矩阵,这是我的最终目标:

X = np.zeros((len(s), number_of_ints_in_string))
for i, cell in enumerate(s):
    X[i,:] = np.asarray(cell.split(' '), dtype = np.float32)

问题是,对于一个很长的系列(这是我的情况),这很慢。有没有更快的方法来做到这一点?

最佳答案

使用Series.str.splitexpand=True 转换为 DataFrame,然后通过 DataFrame.to_numpy 将其转换为 numpy 数组 :

s = pd.Series(['1 17 -3','100 -27 344','0 14 2'])
print (s)
0        1 17 -3
1    100 -27 344
2         0 14 2
dtype: object

arr = s.str.split(expand=True).to_numpy().astype(np.float32)
print (arr)
[[  1.  17.  -3.]
 [100. -27. 344.]
 [  0.  14.   2.]]

另一个想法是使用列表理解:

arr = np.asarray([x.split() for x in s], dtype = np.float32)
print (arr)
[[  1.  17.  -3.]
 [100. -27. 344.]
 [  0.  14.   2.]]

第二个解决方案速度更快,为 300k 行:

s = pd.Series(['1 17 -3','100 -27 344','0 14 2'])
s = pd.concat([s] * 100000, ignore_index=True)


In [52]: %timeit np.asarray([x.split() for x in s], dtype = np.float32)
521 ms ± 10.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [53]: %timeit s.str.split(expand=True).to_numpy().astype(np.float32)
939 ms ± 6.08 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

关于python - 将 pandas 系列字符串整数转换为 numpy 矩阵 - 高效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59745959/

相关文章:

python - 比较 csv 文件中的两行 - Python

python - 为 Pandas 数据框中的每一行运行一次函数

Python - 如何不按字母顺序对 Sphinx 输出进行排序

python - Pandas:如何将日期格式 %Y-%M-%D 转换为 %Y%M%D?

Python:选择具有更改值的行

python - 需要一次迭代 pandas.DataFrame 3 行的数据清理

python重命名多列和汇总数据框

python - django 用户的用户名和电子邮件相同吗?

python - 如何在 Python 中进行 "performance-based"(基准)单元测试

Python 循环 double 印