У меня есть серия панд, каждая ячейка содержит строку целых (одинаковое количество целых в каждой строке, разделенных пробелом), например
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)