2016-08-05 141 views
6

我有一個包含姓名,身高,體重和出生日期等個人數據的數據集。我會根據特定月份和年份出生的人數構建一張圖表。我使用python熊貓來完成這個,我的策略是嘗試按年份和月份進行分組並添加使用計數。但最接近的是按年或按月計算人數,但兩者都不是。如何使用Pandas按月份和年份對行進行分組和計數?

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

stackoverflow中的其他問題指向一個名爲TimeGrouper的石斑魚,但在熊貓文檔中搜索沒有發現任何東西。任何想法?

回答

7

要對多個標準組,通過列或準則的列表:

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

實施例:

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

另一個解決方案是設置birthdate作爲索引和重採樣:

import pandas as pd 

df = pd.DataFrame({'birthdate': pd.date_range(start='20-12-2015', end='3-1-2016')}) 
df.set_index('birthdate').resample('MS').size() 

輸出:

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

您還可以to_period使用「月」期間與dt訪問:

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 

值得一提的,如果日期時間是索引(而不是列),你可以使用resample

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