2017-07-07 4 views
2

eine Datei wie folgt gegeben:Crosstab Datenrahmen mit gesampleten Datumzeit von Tabellendatei

date uselessinfo category uselessinfo2 
2011-07-22 02:56:36 banana 1 apple 
2011-02-27 17:15:44 banana 4 apple 
2010-12-12 00:13:42 banana 1 apple 
2010-10-12 00:13:00 banana 2 apple 

I Pandas bin mit einem Datenrahmen bauen:

data = pd.read_table(pathToFile, "\t") 

Von diesem Ich versuche einfach Pandas Methoden zu verwenden, Erstellen Sie eine Kreuztabellenmatrix wie zum Beispiel:

Wo Spalten Kategorien sind, Zeilen sind Daten Bins und Werte sind t Das Auftreten von Kategorien in diesen Bins

Mein Problem ist, dass ich nicht weiß, wie die Datumsangaben entweder nach Jahren oder Monat bin und dann die Kreuztabellenmatrix erstellen. Ich habe auf Stackoverflow gesehen, dass die Resampling-Funktion der beste Weg, um ist Datetimes und Kreuztabellen- ist, um dann die Matrix zu bauen:

data = data.resample('M', on='date').sum() 
data = pd.crosstab(data.date,data.category) 

Gibt es eine Möglichkeit, diese beiden Funktionen zu kombinieren, um die gewünschte Matrix zu bekommen? Oder mache ich total falsch?

Ziel zu erreichen, ist diese Matrix zu verwenden, eine Seaborn Heatmap wie die Suche zu zeichnen: enter image description here

Antwort

3

Es scheint, Sie date-year konvertieren müssen:

data = pd.read_table(pathToFile, "\t", parse_dates=['date']) 

data = pd.crosstab(data.date.dt.year ,data.category) 

print (data) 
category 1 2 4 
date    
2010  1 1 0 
2011  1 0 1 

Aber wenn Bedarf zuerst Monate resamplen :

data = data.resample('M', on='date').sum().reset_index() 
data = pd.crosstab(data.date.dt.year,data.category) 

Unterschied am besten, wenn chagned Daten gesehen:

print (data) 
       date uselessinfo category uselessinfo2 
0 2011-07-22 02:56:36  banana   1  apple 
1 2011-07-27 02:56:36  banana   7  apple 
2 2011-08-27 17:15:44  banana   4  apple 
3 2011-09-12 00:13:42  banana   1  apple 
4 2011-09-12 00:13:00  banana   2  apple 


data = data.resample('M', on='date').sum().reset_index() 
data = pd.crosstab(data.date.dt.year,data.category) 
print (data) 
category 3 4 8 
date    
2011  1 1 1 

data = pd.crosstab(data.date.dt.year,data.category) 
print (data) 
category 1 2 4 7 
date     
2011  2 1 1 1 
+0

funktionierte wirklich gut und einfach zu stimmen! Ich frage mich nur über die Resampling-Linie (die ich für jetzt kommentiert). Warum ändern sich die Kategorien, während wir angeben, dass wir nach "Daten" resampeln möchten? – Vanpourix

+0

Hmmm, wenn Sie nach Monaten neu berechnen und Daten benötigen, werden alle Daten in das letzte Datum des Monats konvertiert. Es ist von Design in Pandas. Vielleicht kann auch [Docs] (http://pandas.pydata.org/pandas-docs/stable/timeseries.html#resampling) – jezrael

+0

Und Ategories geändert werden, weil es nach Monaten gruppiert und aggregiert nach Summe - also Kategorien sind Zahlen und sind summiert. – jezrael

0
data = pd.crosstab(data.date.dt.year,data.category) 
print (data) 
category 1 2 4 7 
date     
2011  2 1 1 1 

verstanden, das würde bedeuten, dass ich wahrscheinlich nicht für meine Anwendung neu berechnen müssen. Was passiert, wenn ich will von diesem gehen:

category 1 2 4 7 
date 
2011-05 2 1 1 1 
2011-06 2 1 1 1 

dazu:

category 1 2 4 7 
date 
2011 4 2 2 2