Преобразование серии pandas строковых целых в матрицу numpy - эффективно - PullRequest
1 голос
/ 15 января 2020

У меня есть серия 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)

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

1 Ответ

2 голосов
/ 15 января 2020

Используйте Series.str.split с expand=True для DataFrame, а затем преобразуйте его в numpy array с помощью DataFrame.to_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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...