2013-09-05 23 views
28

Ho un oggetto Pandas trama di dati di forma (X, Y) che assomiglia a questo:Aggiungere matrice NumPy come colonna Pandas frame di dati

[[1, 2, 3], 
[4, 5, 6], 
[7, 8, 9]] 

e NumPy matrice sparsa (CSC) di forma (X , Z) che sembra qualcosa di simile

[[0, 1, 0], 
[0, 0, 1], 
[1, 0, 0]] 

Come posso aggiungere il contenuto dalla matrice al frame di dati in una nuova colonna denominata in modo che il frame di dati finirà in questo modo:

[[1, 2, 3, [0, 1, 0]], 
[4, 5, 6, [0, 0, 1]], 
[7, 8, 9, [1, 0, 0]]] 

Si noti che il frame di dati ora ha forma (X, Y + 1) e le righe dalla matrice sono elementi nel frame di dati.

+1

Questo tipo di annidamento è sconsigliato. Perché hai bisogno di fare questo? –

+0

Vedere questa domanda: http://stackoverflow.com/q/18641148/564538 –

+0

Desidero mantenere la possibilità di selezionare il contenuto precedente della matrice da un nome di singola colonna dopo l'unione. –

risposta

22
import numpy as np 
import pandas as pd 
import scipy.sparse as sparse 

df = pd.DataFrame(np.arange(1,10).reshape(3,3)) 
arr = sparse.coo_matrix(([1,1,1], ([0,1,2], [1,2,0])), shape=(3,3)) 
df['newcol'] = arr.toarray().tolist() 
print(df) 

cede

0 1 2  newcol 
0 1 2 3 [0, 1, 0] 
1 4 5 6 [0, 0, 1] 
2 7 8 9 [1, 0, 0] 
+3

Immagino che non possiamo davvero fornire scarpe antiproiettile per gli utenti che insistono nel fare cose del genere:/ –

+6

Ci sono [cose interessanti che si possono fare con una colonna di elenchi] (http: // stackoverflow.com/a/16637607/190597), quindi preferirei non ritenere che questa sia necessariamente una cattiva idea. Anche se sono d'accordo, c'è un'alta probabilità che sia così. – unutbu

+1

Questo è un meraviglioso esempio di flessibilità 'panda '. Nel caso di * questa * domanda, i dati sono già di tipo numerico omogeneo con righe di forma uguale, mentre in quell'esempio sono 'list's di lunghezza diversa. Sono d'accordo che ci sono cose interessanti che puoi fare. Tuttavia, quando hai già una matrice, perché trasformarla in una lista di liste? –

8

considerare l'utilizzo di un datastructure dimensionale superiore (un Panel), piuttosto che la memorizzazione di un array in colonna:

In [11]: p = pd.Panel({'df': df, 'csc': csc}) 

In [12]: p.df 
Out[12]: 
    0 1 2 
0 1 2 3 
1 4 5 6 
2 7 8 9 

In [13]: p.csc 
Out[13]: 
    0 1 2 
0 0 1 0 
1 0 0 1 
2 1 0 0 

Guarda sezioni, ecc, ecc , ecc.

In [14]: p.xs(0) 
Out[14]: 
    csc df 
0 0 1 
1 1 2 
2 0 3 

See the docs for more on Panels.

+4

Il pannello è ora obsoleto –

+0

Sì, solitamente è consigliato MultiIndex al giorno d'oggi. Creato ad es. tramite 'pd.concat ([df, csc], axis = 1, keys = [" df "," csc "])'. –

+0

'A = np.eye (3); df = pd.concat ([A, A], axis = 1) '-> TypeError: non è possibile concatenare un oggetto non-NDFrame in 20.2? (Un wiki di "pandas-deprecated-now-use-this" sarebbe bello.) – denis

Problemi correlati