Ein Pandas DataFrame
enthält eine Spalte mit dem Namen "date"
, die nicht eindeutige datetime
Werte enthält. Ich kann die Zeilen in diesem Rahmen gruppieren mit:
data.groupby(data['date'])
Dies teilt die Daten jedoch durch die datetime
Werte auf. Ich möchte diese Daten nach dem in der Spalte "Datum" gespeicherten Jahr gruppieren. Diese Seite zeigt, wie in Fällen, in denen der Zeitstempel als Index verwendet wird, nach Jahr gruppiert wird, was in meinem Fall nicht der Fall ist.
Wie erreiche ich diese Gruppierung?
Antworten:
Ich benutze Pandas 0.16.2. Dies hat eine bessere Leistung bei meinem großen Datensatz:
Mit Hilfe der
dt
Option und dem Spiel mitweekofyear
,dayofweek
usw. wird viel einfacher.quelle
Die Lösung von ecatmur wird gut funktionieren. Dies ist jedoch eine bessere Leistung bei großen Datenmengen:
data.groupby(data['date'].map(lambda x: x.year))
quelle
map
normalerweise einige gute Effizienzqualitäten bei der Anwendung beliebiger Funktionen im Vergleich zur einfachen Verwendungapply
.Dies ist möglicherweise einfacher mit einem Beispieldatensatz zu erklären.
Beispieldaten erstellen
Nehmen wir an, wir haben eine einzelne Spalte mit Zeitstempeln
date
und eine weitere Spalte, für die wir eine Aggregation durchführen möchtena
.df = pd.DataFrame({'date':pd.DatetimeIndex(['2012-1-1', '2012-6-1', '2015-1-1', '2015-2-1', '2015-3-1']), 'a':[9,5,1,2,3]}, columns=['date', 'a']) df date a 0 2012-01-01 9 1 2012-06-01 5 2 2015-01-01 1 3 2015-02-01 2 4 2015-03-01 3
Es gibt verschiedene Möglichkeiten, nach Jahr zu gruppieren
year
Eigenschaftdate
Index ein und verwenden Sie die anonyme Funktion, um auf das Jahr zuzugreifenresample
Methode.dt
Accessor mityear
EigentumWenn Sie eine Spalte (und keinen Index) von Pandas-Zeitstempeln haben, können Sie mit dem
dt
Accessor auf viele weitere Eigenschaften und Methoden zugreifen . Zum Beispiel:df['date'].dt.year 0 2012 1 2012 2 2015 3 2015 4 2015 Name: date, dtype: int64
Wir können dies verwenden, um unsere Gruppen zu bilden und einige Aggregationen für eine bestimmte Spalte zu berechnen:
df.groupby(df['date'].dt.year)['a'].agg(['sum', 'mean', 'max']) sum mean max date 2012 14 7 9 2015 6 2 3
Setzen Sie das Datum in den Index und verwenden Sie die anonyme Funktion, um auf das Jahr zuzugreifen
Wenn Sie die Datumsspalte als Index festlegen, wird sie zu einem DateTimeIndex mit denselben Eigenschaften und Methoden wie der
dt
Accessor normale Spaltendf1 = df.set_index('date') df1.index.year Int64Index([2012, 2012, 2015, 2015, 2015], dtype='int64', name='date')
Interessanterweise können Sie bei Verwendung der groupby-Methode eine Funktion übergeben. Diese Funktion wird implizit an den DataFrame-Index übergeben. So können wir das gleiche Ergebnis von oben mit folgendem erhalten:
df1.groupby(lambda x: x.year)['a'].agg(['sum', 'mean', 'max']) sum mean max 2012 14 7 9 2015 6 2 3
Verwenden Sie die
resample
MethodeWenn sich Ihre Datumsspalte nicht im Index befindet, müssen Sie die Spalte mit dem
on
Parameter angeben . Sie müssen auch den Offset-Alias als Zeichenfolge angeben .df.resample('AS', on='date')['a'].agg(['sum', 'mean', 'max']) sum mean max date 2012-01-01 14.0 7.0 9.0 2013-01-01 NaN NaN NaN 2014-01-01 NaN NaN NaN 2015-01-01 6.0 2.0 3.0
In Pandas konvertieren Periode
Sie können die Datumsspalte auch in ein Pandas Period-Objekt konvertieren. Wir müssen den Offset-Alias als Zeichenfolge übergeben, um die Länge der Periode zu bestimmen.
df['date'].dt.to_period('A') 0 2012 1 2012 2 2015 3 2015 4 2015 Name: date, dtype: object
Wir können dies dann als Gruppe verwenden
df.groupby(df['date'].dt.to_period('Y'))['a'].agg(['sum', 'mean', 'max']) sum mean max 2012 14 7 9 2015 6 2 3
quelle
to_period('A')
Wofür ist das ('A') in der letzten Methode, die Sie verwenden ?'A'
ist ein Zeitreihen-Offset-Alias: pandas.pydata.org/pandas-docs/stable/….dt.year
Methode ausführe und sie in einem neuen Datenrahmen speichere, werden die Daten als Indizes gespeichert. Dies wird problematisch, wenn ich die Daten plotten muss, da die Spalte "Datumsangaben" nicht wirklich vorhanden ist, sondern nur die drei bereitgestellt in.agg()
Das sollte funktionieren:
data.groupby(lambda x: data['date'][x].year)
quelle
das wird auch funktionieren
data.groupby(data['date'].dt.year)
quelle
<pandas.core.groupby.DataFrameGroupBy object at 0x10d7f6438>
ist das, was ich bekomme, wenn ich hingerichtet werde.