2013-01-17 13 views
7

Mi sembra un errore nei panda.Reshape of pandas series?

a = pd.Series([1,2,3,4]) 
b = a.reshape(2,2) 
b 

b è di tipo serie, ma non può essere visualizzato, l'ultima affermazione dà eccezione, molto lungo, l'ultima riga è "TypeError:% formato d: è richiesto un numero, non numpy.ndarray". b.shape restituisce (2,2), che contraddice il suo tipo di serie. Sto indovinando forse pandas.Series non implementa la funzione di risagoma e sto chiamando la versione da np.array? Qualcuno vede anche questo errore? Sono a panda 0.9.1.

+2

Non ho molta familiarità con Panda, ma capisco che il suo fascino e le sue limitazioni consistono nell'avere oggetti dedicati per matrici di dimensioni diverse. Quindi, anche se c'è un numpy in background, 'pd.Series' è sempre 1D, e' pd.DataFrame' è sempre 2D. Quindi rimodellare uno di quegli oggetti nel modo in cui il tuo fare non ha molto senso. – Jaime

+0

E "il modo in cui ** il tuo ** fare" dovrebbe essere "il modo in cui ** stai ** facendo" ... Vergognati! – Jaime

risposta

11

È possibile chiamare reshape sui valori gamma della serie: (? Non si ignora l'indice)

In [4]: a.values.reshape(2,2) 
Out[4]: 
array([[1, 2], 
     [3, 4]], dtype=int64) 

Io in realtà penso che non sarà sempre un senso per applicare reshape ad una serie, e che siete sulla strada giusta nel pensare che sia rimodellare solo di NumPy:

a.reshape?
Docstring: See numpy.ndarray.reshape

che ha detto, sono d'accordo sul fatto che ti permette di cercare di fare questo appare come un bug.

+0

Una volta ho sottoclassato 'ndarray' per implementare un oggetto fisso di dimensionalità. Si è tentati di catturare 'reshape's e non permetterli, ma molte delle cose interessanti che hai imparato ad amare in Numpy si basano sulla modifica delle dimensioni dei dati sottostanti, ad es. sbarazzarsi di 'reshape' e' tile' non funziona più. Potrebbe essere questo un piccolo, inevitabile, prezzo da pagare per il riutilizzo del motore di Numpy in Panda. – Jaime

+0

@Jaime il fatto che causi un'eccezione quando provi a farlo è sicuramente un bug, o dovrebbe permetterti di farlo su un DataFrame (e reindicatore) o il metodo non dovrebbe essere disponibile? –

+0

Il punto è che non è possibile renderlo non disponibile senza rompere altre funzionalità, a meno che non si sia disposti a rifare un sacco di ciò che Numpy ti dà gratuitamente. Non è bello, sono d'accordo, ma potrebbe essere davvero il meglio che è possibile. – Jaime

1

La funzione Reshape prende la nuova forma come una tupla piuttosto che come più argomenti:

In [4]: a.reshape? 
Type:  function 
String Form:<function reshape at 0x1023d2578> 
File:  /Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/numpy/core/fromnumeric.py 
Definition: numpy.reshape(a, newshape, order='C') 
Docstring: 
Gives a new shape to an array without changing its data. 

Parameters 
---------- 
a : array_like 
    Array to be reshaped. 
newshape : int or tuple of ints 
    The new shape should be compatible with the original shape. If 
    an integer, then the result will be a 1-D array of that length. 
    One shape dimension can be -1. In this case, the value is inferred 
    from the length of the array and remaining dimensions. 

Reshape è effettivamente implementata in serie e restituirà un ndarray:

In [11]: a 
Out[11]: 
0 1 
1 2 
2 3 
3 4 

In [12]: a.reshape((2, 2)) 
Out[12]: 
array([[1, 2], 
     [3, 4]]) 
0

è possibile direttamente utilizzare a.reshape((2,2)) per rimodellare una serie, ma non è possibile rimodellare direttamente un DataFrame di panda, perché non esiste una funzione di risagoma per DataFrame di panda, ma è possibile eseguire la risagoma su numpy ndarray:

  1. convertito dataframe a NumPy ndarray
  2. fanno rimodellare
  3. riconvertire

esempio

a = pd.DataFrame([[1,2,3],[4,5,6]]) 
b = a.as_matrix().reshape(3,2) 
a = pd.DataFrame(b) 
0

Basta usare questo codice qui sotto:

b=a.values.reshape(2,2) 

penso che vi aiuterà. u puoi usare direttamente solo la funzione reshape() ma darà avviso futuro

+1

Aggiungi un po 'di spiegazione insieme al codice in quanto aiuta a capire il tuo codice. Le sole risposte al codice sono disapprovate. –