2013-10-29 12 views
15

Si verifica un errore e non sono sicuro di come risolverlo.Pandas Dataframe ValoreErrore: la forma dei valori passati è (X,), gli indici implicano (X, Y)

Il seguente sembra funzionare:

def random(row): 
    return [1,2,3,4] 

df = pandas.DataFrame(np.random.randn(5, 4), columns=list('ABCD')) 

df.apply(func = random, axis = 1) 

e la mia uscita è:

[1,2,3,4] 
[1,2,3,4] 
[1,2,3,4] 
[1,2,3,4] 

Tuttavia, quando cambio una delle delle colonne per un valore come 1 o Nessuno:

def random(row): 
    return [1,2,3,4] 

df = pandas.DataFrame(np.random.randn(5, 4), columns=list('ABCD')) 
df['E'] = 1 

df.apply(func = random, axis = 1) 

ho la l'errore:

012.351.641.061.
ValueError: Shape of passed values is (5,), indices imply (5, 5) 

Ho lottato con questo per alcuni giorni e niente sembra funzionare. Ciò che è interessante è che quando cambio

def random(row): 
    return [1,2,3,4] 

a

def random(row): 
    print [1,2,3,4] 

tutto sembra funzionare normalmente.

Questa domanda è un modo più chiaro di asking this question, che ritengo possa essere stato confuso.

Il mio obiettivo è calcolare un elenco per ogni riga e quindi creare una colonna fuori di esso.

MODIFICA: Originariamente inizio con un dataframe che ha una colonna. Aggiungo 4 colonne in 4 differenze per applicare i passaggi, e poi quando provo ad aggiungere un'altra colonna ottengo questo errore.

+1

cosa stai in realtà cercando di fare? usando apply con una funzione che restituisce una lista cercherà di forzare questo ad una serie, quindi ha bisogno della stessa lunghezza della lunghezza originale, OPPURE uno scalare (incluso None). – Jeff

+0

L'output nella tua domanda non è quello che ottieni da applicare. Il tuo output nel primo caso è DataFrame con 4 colonne, come ha detto @Jeff, è un elenco coercitato in righe. –

+0

Sto cercando di aggiungere una colonna al dataframe. Questa colonna deve essere riempita con un valore calcolato. Il valore calcolato viene calcolato dai valori di ogni riga. La funzione random è la cosa che calcola il valore. – user1367204

risposta

6

Se il vostro obiettivo è aggiungere nuova colonna dataframe, basta scrivere la vostra funzione come funzione che restituisce valore scalare (non elenco), qualcosa di simile:

>>> def random(row): 
...  return row.mean() 

e quindi utilizzare applica:

>>> df['new'] = df.apply(func = random, axis = 1) 
>>> df 
      A   B   C   D  new 
0 0.201143 -2.345828 -2.186106 -0.784721 -1.278878 
1 -0.198460 0.544879 0.554407 -0.161357 0.184867 
2 0.269807 1.132344 0.120303 -0.116843 0.351403 
3 -1.131396 1.278477 1.567599 0.483912 0.549648 
4 0.288147 0.382764 -0.840972 0.838950 0.167222 

Non so se è possibile che la nuova colonna contenga elenchi, ma è delimitato per contenere tuple ((...) anziché [...]):

>>> def random(row): 
... return (1,2,3,4,5) 
... 
>>> df['new'] = df.apply(func = random, axis = 1) 
>>> df 
      A   B   C   D    new 
0 0.201143 -2.345828 -2.186106 -0.784721 (1, 2, 3, 4, 5) 
1 -0.198460 0.544879 0.554407 -0.161357 (1, 2, 3, 4, 5) 
2 0.269807 1.132344 0.120303 -0.116843 (1, 2, 3, 4, 5) 
3 -1.131396 1.278477 1.567599 0.483912 (1, 2, 3, 4, 5) 
4 0.288147 0.382764 -0.840972 0.838950 (1, 2, 3, 4, 5) 
+0

Ma il ritorno dalla funzione sarà un elenco di elementi. In altre parole, la "nuova" colonna è composta da un elenco di elenchi. Non riesco a farlo funzionare con le liste di ritorno. – user1367204

+0

@ user1367204 risposta aggiornata, è possibile utilizzare le tuple se si desidera –

+0

Per favore, dare un esempio? Vuoi dire che dovrei restituire una tupla invece di una lista? Ho provato a cambiare ritorno [1,2,3,4] per ritorno (1,2,3,4) e ho ottenuto lo stesso errore. – user1367204

0

Io uso il codice qui sotto è proprio bene

import numpy as np  
df = pd.DataFrame(np.array(your_data), columns=columns) 
+0

Potresti modificare la tua risposta per fornire un po 'più di contesto? Come risolve il problema originale? Si prega di consultare la sezione di aiuto per una grande introduzione alla scrittura di risposte qui: https://stackoverflow.com/help/answering – Graham

Problemi correlati