Pandas DataFrame con X, Y coordina a la matriz NumPy

Tengo un DataFrame con columnas X , Y y value , por ejemplo:

  X | Y | value ------------------ 1 | 1 | 56 2 | 1 | 13 3 | 1 | 25 ... | ... | ... 1 | 2 | 7 2 | 2 | 18 ... | ... | ... 1 | 123 | 91 ... | ... | ... 50 | 123 | 32 

Necesito convertir esto a DataFrame en una matriz NumPy:

 [[56, 13, 25, ...], [ 7, 18, ...], ..., [ 91, ... , 32]] 

Sé que puedo recorrer en iteración cada celda del DataFrame, pero eso es demasiado lento. ¿Cuál es la forma efectiva de hacer esto?

También tenga en cuenta: faltan valores para algunas coordenadas en DataFrame

Gire el dataframe y los valores deben ser lo que necesita:

 df.pivot('Y', 'X', 'value').values #array([[ 56., 13., 25., nan], # [ 7., 18., nan, nan], # [ 91., nan, nan, 32.]]) 

Usando set_index

 In [501]: df.set_index(['Y', 'X']).unstack().values Out[501]: array([[ 56., 13., 25., nan], [ 7., 18., nan, nan], [ 91., nan, nan, 32.]]) 

O , usando groupby

 In [493]: df.groupby(['Y', 'X'])['value'].sum().unstack().values Out[493]: array([[ 56., 13., 25., nan], [ 7., 18., nan, nan], [ 91., nan, nan, 32.]]) 

O bien , utilizando la crosstab

 In [500]: pd.crosstab(index=df.Y, columns=df.X, values=df.value, aggfunc='sum').values Out[500]: array([[ 56., 13., 25., nan], [ 7., 18., nan, nan], [ 91., nan, nan, 32.]]) 

O, usando pd.pivot_table como se pd.pivot_table en otra respuesta.

Lo haría pasando por una matriz de coordenadas dispersas, que es básicamente el formato que tiene.

NB, los puntos que faltan se almacenarán como 0 si se convierte a una matriz.

Si le falta una tonelada, podría ser mejor atenerse a una matriz dispersa por motivos de memoria o rendimiento, dependiendo de sus procesos posteriores.

 x = pd.DataFrame({'X':[1,2,3,1,2,1,4], 'Y':[1,1,1,2,2,3,3], 'Z':[56,13,25,7,18,91,32]}) #import coo from sparse from scipy.sparse import coo_matrix #it works like (data,(y,x)) out = coo_matrix((xZ,(xY-1,xX-1))) #-1, as you aren't 0 indexed above #if you really don't want sparse turn it to an array: out.toarray() array([[56, 13, 25, 0], [ 7, 18, 0, 0], [91, 0, 0, 32]], dtype=int64)