2016-08-05 10 views
6

Ich habe einen Datensatz mit persönlichen Daten wie Name, Größe, Gewicht und Geburtsdatum. Ich würde eine Grafik mit der Anzahl der Menschen erstellen, die in einem bestimmten Monat und Jahr geboren wurden. Ich benutze Python Pandas, um dies zu erreichen und meine Strategie war zu versuchen, nach Jahr und Monat zu gruppieren und mit Count zu addieren. Aber am nächsten komme ich, um die Anzahl der Leute nach Jahr oder Monat zu ermitteln, aber nicht nach beiden.Wie gruppiert und zählt man Reihen mit Pandas nach Monat und Jahr?

df['birthdate'].groupby(df.birthdate.dt.year).agg('count') 

Andere Fragen in Stackoverflow Punkt zu einem Grouper genannt TimeGrouper aber in Pandas Dokumentation der Suche nichts gefunden. Irgendeine Idee?

Antwort

7

Zur Gruppe auf mehreren Kriterien, um eine Liste der Spalten oder Kriterien erfüllen:

df['birthdate'].groupby([df.birthdate.dt.year, df.birthdate.dt.month]).agg('count') 

Beispiel:

In [165]: 
df = pd.DataFrame({'birthdate':pd.date_range(start=dt.datetime(2015,12,20),end=dt.datetime(2016,3,1))}) 
df.groupby([df['birthdate'].dt.year, df['birthdate'].dt.month]).agg({'count'}) 

Out[165]: 
        birthdate 
         count 
birthdate birthdate   
2015  12    12 
2016  1    31 
      2    29 
      3     1 
7

Eine andere Lösung ist birthdate als Index und Resampling einzustellen:

Ausgabe:

birthdate 
2015-12-01 12 
2016-01-01 31 
2016-02-01 29 
2016-03-01  1 
Freq: MS, dtype: int64 
3

Sie können auch die „monatlich“ Zeit mit to_period mit dem dt Accessor verwenden:

In [11]: df = pd.DataFrame({'birthdate': pd.date_range(start='20-12-2015', end='3-1-2016')}) 

In [12]: df['birthdate'].groupby(df.birthdate.dt.to_period("M")).agg('count') 
Out[12]: 
birthdate 
2015-12 12 
2016-01 31 
2016-02 29 
2016-03  1 
Freq: M, Name: birthdate, dtype: int64 

Es ist bemerkenswert, wenn die Datumzeit der Index (anstatt eine Spalte) ist man resample verwenden kann :

df.resample("M").count() 
Verwandte Themen