2017-12-18 1 views
0

Allgemein habe ich den Smart Meters-Datensatz von Kaggle und versuche, die erste und letzte Messung nach Haus zu zählen und dann zu aggregieren, um zu sehen, wie viele Häuser begannen (oder beendet) Berichterstattung an einem bestimmten Tag. Ich bin offen für Methoden, die völlig anders sind als die Linie, die ich weiterführe.Zählfrequenz eines Aggregat-Ergebnisses mit Pandas

In SQL, wenn Daten zu erforschen ich so etwas wie folgt oft verwendet:

SELECT Max_DT, COUNT(House_ID) AS HouseCount 
FROM 
(
    SELECT House_ID, MAX(Date_Time) AS Max_DT 
    FROM ElectricGrid GROUP BY HouseID 
) MeasureMax 
GROUP BY Max_DT 

Ich versuche, diese Logik in Pandas zu replizieren und scheitern. Ich kann die anfängliche Aggregation erhalten wie:

house_max = house_info.groupby('House_Id').agg({'Date_Time' :['max']}) 

Allerdings versage ich die äußere Abfrage zu bekommen. Insbesondere weiß ich nicht, wie die aggregierte Spalte aufgerufen wird. Wenn ich eine describe() schreibe, wird es im obigen Beispiel als Date_Time angezeigt. Ich habe versucht, das Umbenennen der Spalten:

house_max.columns = ['House_Id','Max_Date_Time'] 

ich eine StackOverflow discussion über das Umbenennen der Ergebnisse der Aggregation gefunden und versucht, sie anzuwenden:

house_max.columns = ["_".join(x) for x in house_max.columns.ravel()] 

Ich finde immer noch, dass ein beschreiben() gibt Date_Time als Spaltenname .

start_end_collate = house_max.groupby('Date_Time_max')['House_Id'].size() 

Im Umbenennungsbeispiel kann meine zweite Abfrage Date_Time oder Max_Date_Time nicht finden. Im letzteren Fall scheint der Ravel-Code House_Id nicht zu finden, wenn ich ihn ausführe.

Antwort

1

Das scheint seltsam, ich würde denken, dass Ihr Code das Feld House_Id nicht finden könnte. Nachdem Sie Ihre groupby auf House_Id ausgeführt haben, wird es zu einem Index, den Sie nicht als Spalte referenzieren können.

Diese Arbeit sollte:

house_max = house_info.groupby('House_Id').agg({'Date_Time' :['max']}) 
house_max.columns = ["_".join(x) for x in house_max.columns.ravel()] 
start_end_collate = house_max.groupby('Date_Time_max').size() 

Alternativ können Sie einfach die Multi-Level-Spalte löschen:

house_max.columns = house_max.columns.droplevel(0) 
start_end_collate = house_max.groupby('max').size() 
+0

bekam man es in einem. Vielen Dank. Ich habe das schon lange angestarrt, also habe ich nicht einmal versucht, zurückzugehen und meinen Fehler zu verstehen, aber ich werde morgen wieder schauen. Danke nochmal. –