2017-04-06 5 views
1

Ich versuche, eine Heatmap mit Seaborn zu generieren, aber ich habe ein kleines Problem mit der Formatierung meiner Daten.Pandas Pivot-Tabelle für Heatmap

Derzeit sind meine Daten in der Form:

Name  Diag Date 
A  1  2006-12-01 
A  1  1994-02-12 
A  2  2001-07-23 
B  2  1999-09-12 
B  1  2016-10-12 
C  3  2010-01-20 
C  2  1998-08-20 

Ich mag eine Heatmap (vorzugsweise in Python) auf einer Achse erzeugen Name gegen Diag zeigt - wenn aufgetreten. Ich habe versucht, den Tisch zu schwenken pd.pivot verwenden, aber ich war der Fehler gegeben

ValueError: Index contains duplicate entries, cannot reshape

dieses kam:

PIV = df.pivot_table (Index = 'Name', Spalten = 'Diag')

Die Zeit ist irrelevant, aber ich würde gerne zeigen, welche Names haben welche Diag, und welche Diag Combos Cluster zusammen. Muss ich dafür eine neue Tabelle erstellen oder ist das möglich? In einigen Fällen wird die Name nicht mit allen EDIT Diag

verbunden: Ich habe da versucht: PIV = df.pivot_table (Index = 'Name', Spalten = 'Diag', Werte = 'Zeit', aggfunc = ‚mean‘)

jedoch als Zeit in Datetime-Format ist, dass ich am Ende mit:
pandas.core.base.DataError: Keine numerischen Typen

+1

Diese Frage könnte stark von Code profitieren, der zeigt, was Sie tatsächlich für Ihre Pivot-Syntax ausprobiert haben. Wenn wir nur den Fehler anzeigen, bleibt jeder, der es liest, viel raten. –

Antwort

4

Sie benötigen pivot_table mit einiger Aggregatfunktion zu aggregieren, da für gleicher Index und Spalte haben mehrere Werte und pivot benötigen nur eindeutige Werte:

print (df) 
    Name Diag Time 
0 A  1 12 <-duplicates for same A, 1 different value 
1 A  1 13 <-duplicates for same A, 1 different value 
2 A  2 14 
3 B  2 18 
4 B  1  1 
5 C  3  9 
6 C  2  8 

df = df.pivot_table(index='Name',columns='Diag', values='Time', aggfunc='mean') 
print (df) 
Diag  1  2 3 
Name     
A  12.5 14.0 NaN 
B  1.0 18.0 NaN 
C  NaN 8.0 9.0 

Alternative Lösung:

df = df.groupby(['Name','Diag'])['Time'].mean().unstack() 
print (df) 
Diag  1  2 3 
Name     
A  12.5 14.0 NaN 
B  1.0 18.0 NaN 
C  NaN 8.0 9.0 

EDIT:

Sie auch alle Duplikate von duplicated überprüfen:

df = df.loc[df.duplicated(['Name','Diag'], keep=False), ['Name','Diag']] 
print (df) 
    Name Diag 
0 A  1 
1 A  1 

EDIT:

mean of datetimes ist nicht einfach - müssen die Daten in nanoseconds umrechnen, gemittelt werden und zuletzt in datetimes konvertiert werden. Auch gibt es ein anderes Problem - ersetzen müssen NaN zu einigen skalaren, z. 0 was in 0 datetime konvertiert wird - 1970-01-01.

df.Date = pd.to_datetime(df.Date) 
df['dates_in_ns'] = pd.Series(df.Date.values.astype(np.int64), index=df.index) 
df = df.pivot_table(index='Name', 
        columns='Diag', 
        values='dates_in_ns', 
        aggfunc='mean', 
        fill_value=0) 
df = df.apply(pd.to_datetime) 
print (df) 
Diag     1   2   3 
Name           
A 2000-07-07 12:00:00 2001-07-23 1970-01-01 
B 2016-10-12 00:00:00 1999-09-12 1970-01-01 
C 1970-01-01 00:00:00 1998-08-20 2010-01-20 
+0

Danke! Das ist hilfreich. Das Problem könnte nun sein, dass die Zeit tatsächlich im Format des Datumsformats liegt, also nicht numerisch ist. vielleicht sollte ich nur eine Spalte für eine als Workaround hinzufügen? – JB1

+0

Ich denke, es ist das gleiche Problem. Aber ich habe eine Idee, wie diese Werte überprüft werden, geben Sie mir eine Sekunde. – jezrael

+0

pandas.core.base.DataError: Keine numerischen Typen zum aggregieren sind mein aktueller Fehler. Leider habe ich nicht die richtigen Datentypen im Beispiel für die Zeit in der Form '2016-12-12' – JB1