Convierta una serie de pandas de listas en una matriz numpy

Aug 20 2020

Quiero convertir una serie de pandas de cadenas de lista de números en una matriz numpy. Lo que tengo es algo como:

ds = pd.Series(['[1 -2 0 1.2 4.34]', '[3.3 4 0 -1 9.1]'])

Mi resultado deseado:

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

Lo que he hecho hasta ahora es convertir la serie pandas en una serie de una lista de números como:

ds1 = ds.apply(lambda x: [float(number) for number in x.strip('[]').split(' ')])

pero no sé cómo ir de ds1a arr.

Respuestas

5 ShubhamSharma Aug 20 2020 at 19:52

Use Series.str.strip+ Series.str.splity cree uno nuevo np.arraycon dtype=float:

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

Resultado:

print(arr)

array([[ 1.  , -2.  ,  0.  ,  1.2 ,  4.34],
       [ 3.3 ,  4.  ,  0.  , -1.  ,  9.1 ]])
1 Snoopy Aug 20 2020 at 23:48

Puede intentar eliminar el "[]" del objeto Serie primero, luego las cosas serán más fáciles,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)

Entonces arrserá el formato correcto que desee,

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

Luego hice un pequeño perfil en comparación con la colusión de 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)

¡Obviamente, su solución es mucho más rápida! ¡Salud!