Convierta una serie de pandas de listas en una matriz numpy
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 ds1
a arr
.
Respuestas
Use Series.str.strip+ Series.str.splity cree uno nuevo np.array
con 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 ]])
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 arr
será 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!