Преобразование Серии Строковых Панд в матрицу Numpy - эффективно

У меня есть серия панд, каждая ячейка содержит строку целых (одинаковое количество целых в каждой строке, разделенных пробелом), например

s = pd.Series([Ƈ 17 -3 ... n'],[颼 -27 344 ... n'],...,[Ɔ 14 2 ... n'])

Я знаю, как преобразовать одну ячейку в простой вектор:

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)

проблема в том, что для очень длинных серий (что является моим случаем) это медленно. Есть ли более быстрый способ сделать это?

Всего 1 ответ


Используйте Series.str.split с expand=True для DataFrame, а затем преобразуйте его в numpy array помощью DataFrame.to_numpy :

s = pd.Series([Ƈ 17 -3',颼 -27 344',Ɔ 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.]]

Второе решение быстрее - 300 тыс. Строк:

s = pd.Series([Ƈ 17 -3',颼 -27 344',Ɔ 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)

Есть идеи?

10000