2012-06-27 19 views
30

On Pandas la documentazione del metodo pivot, abbiamo:Pandas perno avvertimento circa le voci ricorrenti su indice

Examples 
-------- 
>>> df 
    foo bar baz 
0 one A 1. 
1 one B 2. 
2 one C 3. 
3 two A 4. 
4 two B 5. 
5 two C 6. 

>>> df.pivot('foo', 'bar', 'baz') 
    A B C 
one 1 2 3 
two 4 5 6 

mio DataFrame è strutturato in questo modo:

name id  x 
---------------------- 
0 john 1  0 
1 john 2  0 
2 mike 1  1 
3 mike 2  0 

E voglio qualcosa di simile:

 1 2 # (this is the id as columns) 
---------------------- 
mike 0 0 # (and this is the 'x' as values) 
john 1 0 

Ma quando eseguo il metodo pivot, è dicendo:

*** ReshapeError: Index contains duplicate entries, cannot reshape 

Il che non ha senso, anche nell'esempio ci sono ripetuti voci nella colonna foo. Sto usando la colonna name come indice del pivot, il primo argomento della chiamata al metodo pivot.

+0

Ho incluso diversi esempi [** qui **] (https://stackoverflow.com/q/47152691/2336654) – piRSquared

risposta

2

Funziona bene per me? Puoi pubblicare la chiamata del metodo pivot esatta che stai utilizzando?

In [4]: df.pivot('name', 'id', 'x') 
Out[4]: 
id 1 2 
name  
john 0 0 
mike 1 0 
+1

Ho molti dati, questo è un piccolo esempio funzionale, cercherò di utilizzare i dati originali, ma il messaggio di errore è di per sé privo di senso, perché l'indice PUO avere voci duplicate, cosa ne pensi? – Tarantula

+0

Se si dispone di duplicati potrebbe essere necessario prima aggregare. Sarebbe bello aggiungere un'opzione a pivot per prendere la prima o l'ultima voce osservata: http://github.com/pydata/pandas/issues/1865 –

+4

anche io ho questo problema. – zach

17

Prova questo,

#drop_duplicates removes entries which have same values for 'foo' and 'bar' 
df = df.drop_duplicates(['foo','bar']) 
df.pivot('foo','bar','baz') 
+0

Grande cattura! In realtà ho dovuto semplicemente cancellare i miei duplicati. Grazie! – Nico

+2

Penso che questa sia probabilmente la risposta corretta per la maggior parte delle persone che visitano qui. Le persone sono confuse perché pensano che i panda chiedono un indice unico. In realtà i panda richiedono che l'indice e le colonne * siano univoci insieme * cioè non ci sono righe nel fotogramma originale in cui * sia * l'indice sia la colonna colonne sono ripetuti. – foobarbecue

+0

questa risposta (e l'elaborazione di foobarbeque) mi sono stati di grande aiuto nel comprendere quell'errore dei panda. Voglio solo aggiungere che nel mio caso (e nella mia esperienza, nella maggior parte dei casi), fare un 'drop_duplicates' rimuoverà l'errore e nasconderà il problema, ma in realtà non risolverà il problema.generalmente eseguirai un'operazione come questa quando stai assumendo che i tuoi indici/colonne siano identificatori univoci di un tipo di record che stai ruotando, quindi probabilmente c'è un bug upstream da qualche parte se stai cercando duplicati. Di nuovo, almeno nella mia esperienza, comunque, lo –

59

Per quanto posso dire con aggiornamenti di panda, è necessario utilizzare tabella_pivot() al posto del perno().

pandas.pivot_table(df,values='count',index='site_id',columns='week') 
+0

ho avuto lo stesso problema, e la tua risposta l'ha risolto per me (in contrasto con gli altri). Sto usando Pandas 0.12.0. –

+0

Ho salvato anche la mia giornata! – sarfata

+0

DataFrame.duplicated() sembra restituire righe non duplicate; ignora la mia colonna della data (ad esempio quando hai misurazioni duplicate in date diverse, duplicated() afferma che sono duplicati, anche se hanno date diverse.) –

1

amici, ho avuto tale problema. Nel mio caso il problema era nei dati: la mia colonna "informazioni" conteneva 1 valore univoco e causava un errore.

UPD: correggere lavoro coppie 'articolazione' (id_user, informazioni) non deve avere dublicates

Funziona:

df2 = pd.DataFrame({'id_user':[1,2,3,4,4,5,5], 
'information':['phon','phon','phone','phone1','phone','phone1','phone'], 
'value': [1, '01.01.00', '01.02.00', 2, '01.03.00', 3, '01.04.00']}) 
df2.pivot(index='id_user', columns='information', values='value') 

non funziona:

df2 = pd.DataFrame({'id_user':[1,2,3,4,4,5,5], 
'information':['phone','phone','phone','phone','phone','phone','phone'], 
'value': [1, '01.01.00', '01.02.00', 2, '01.03.00', 3, '01.04.00']}) 
df2.pivot(index='id_user', columns='information', values='value') 
Problemi correlati