Soy nuevo con pandas. Intento hacer un ejemplo. Tengo una cuadrícula de puntos en tres dimensiones, la dimensión de la cuadrícula es N1 x N2 x N3. Cada punto de la cuadrícula contiene algunos datos (numpy.ndarray
, float
número, etc). Por ejemplo: en Point(0,0,0): "date" = 18
, "temperature array" = numpy.array([[1,2,3], [4,5,6]])
.
Ahora mi objetivo es crear una "tabla" de pandas (invito a un pandas.Panel
) para que cuando llame table["date"][Point(0,0,0)]
, los resultados deben volver: 18
y cuando llamo table["temperature array"][Point(0,0,0)]
, vuelve numpy.array([[1,2,3], [4,5,6]])
.
Si pudieras publicar un ejemplo simple, me ayudará muchísimo.
Gracias
Respuestas
1 para la respuesta № 1Panel4D es probablemente lo que estás buscando. Básicamente, crea un índice multinivel desde tus primeras 3 dimensiones.
import pandas as pd
import numpy as np
# 100 x 100 x 100 x 3 array
data = np.random.randn(100,100,100,3)
data[0,0,0]
# out[]:
# array([ 0.85284721, -0.04883839, -0.09375558])
table = pd.Panel4D(data)
table.ix[0,0,0]
# out[]:
# minor
# 0 0.852847
# 1 -0.048838
# 2 -0.093756
# Name: 0, dtype: float64
1 para la respuesta № 2
No he descubierto cómo almacenar una matriz numpyen una sola celda de un NDFrame de Pandas, y dudo que sea una buena idea, incluso si tuviera éxito. Los NDFrames de Pandas utilizan matrices NumPy para almacenar los datos subyacentes. Para almacenar una matriz NumPy como un valor dentro de una matriz NumPy, la matriz NumPy externa tendría que ser del tipo dtype, lo que evita que NumPy (y Pandas) apliquen rutinas numéricas rápidas a la matriz. Por lo tanto, anidar una matriz NumPy dentro de un NDFrame (como un Panel o DataFrame) perjudicaría el rendimiento.
En su lugar, podría usar un DataFrame con un MultiIndex:
import pandas as pd
index = pd.MultiIndex.from_tuples([(0,0,0),(0,0,1)])
table = pd.DataFrame([(18,1,2,3,4,5,6),
(19,10,20,30,40,50,60)], index=index,
columns=["date","t0","t1","t2","t3","t4","t5"])
print(table)
# date t0 t1 t2 t3 t4 t5
# 0 0 0 18 1 2 3 4 5 6
# 1 19 10 20 30 40 50 60
print(table.ix[(0,0,0),"date"])
# 18
print(table.ix[(0,0,1),"t0":"t5"].reshape(2,-1))
# [[10 20 30]
# [40 50 60]]