我有一个包含姓名,身高,体重和出生日期等个人资料的数据集。我会建立一个图表,显示特定月份和年份出生的人数。我使用python pandas来实现这一点,我的策略是尝试按年份和月份进行分组并添加使用计数。但我最接近的是按年或按月计算人数,但不是两者都计算。
df['birthdate'].groupby(df.birthdate.dt.year).agg('count')
stackoverflow中的其他问题指向名为TimeGrouper的Grouper,但在pandas文档中搜索没有发现任何内容。有什么想法吗?
答案 0 :(得分:23)
要对多个条件进行分组,请传递列或条件列表:
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
<强>更新强>
从版本0.23.0
开始,上述代码由于多索引级别名称必须唯一的限制而不再有效,您现在需要rename
级别才能使其生效:< / p>
In[107]:
df.groupby([df['birthdate'].dt.year.rename('year'), df['birthdate'].dt.month.rename('month')]).agg({'count'})
Out[107]:
birthdate
count
year month
2015 12 12
2016 1 31
2 29
3 1
答案 1 :(得分:11)
您还可以将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()
答案 2 :(得分:8)
另一种解决方案是将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 :(得分:0)
从2019年4月开始:这将起作用。熊猫版-0.24.x
df.groupby([df.dates.dt.year.rename('year'), df.dates.dt.month.rename('month')]).size()
答案 4 :(得分:0)
用各自的列名称替换日期和计数字段。这段代码将根据给定的参数进行分组,求和和排序。您还可以将频率更改为1M或2M,依此类推...
df[['date', 'count']].groupby(pd.Grouper(key='date', freq='1M')).sum().sort_values(by='date', ascending=True)['count']