Python 如何使用熊猫按月份和年份对行进行分组和计数?
我有一个个人数据集,如姓名、身高、体重和出生日期。我会建立一个图表,显示特定月份和年份出生的人数。我正在使用python pandas来实现这一点,我的策略是尝试按年份和月份分组,并使用count添加。但我得到的最接近的数据是按年或按月计算人数,而不是按两者计算Python 如何使用熊猫按月份和年份对行进行分组和计数?,python,pandas,Python,Pandas,我有一个个人数据集,如姓名、身高、体重和出生日期。我会建立一个图表,显示特定月份和年份出生的人数。我正在使用python pandas来实现这一点,我的策略是尝试按年份和月份分组,并使用count添加。但我得到的最接近的数据是按年或按月计算人数,而不是按两者计算 df['birthdate'].groupby(df.birthdate.dt.year).agg('count') stackoverflow中的其他问题指向一个名为TimeGrouper的石斑鱼,但在pandas文档中搜索没有发现
df['birthdate'].groupby(df.birthdate.dt.year).agg('count')
stackoverflow中的其他问题指向一个名为TimeGrouper的石斑鱼,但在pandas文档中搜索没有发现任何东西。有什么想法吗?要对多个条件进行分组,请传递列或条件列表:
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
更新
从版本开始,由于多索引级别名称必须是唯一的限制,上述代码不再有效,您现在需要重命名
级别,以使其工作:
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
另一种解决方案是将
生日设置为索引并重新采样:
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()
输出:
生日
2015-12-01 12
2016-01-01 31
2016-02-01 29
2016-03-01 1
频率:MS,数据类型:int64
您也可以将“每月”期间与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
值得注意的是,如果datetime是您可以使用的索引(而不是列):
截至2019年4月:这将起作用。熊猫版本-0.24.x
df.groupby([df.dates.dt.year.rename('year')、df.dates.dt.month.rename('month'))).size()
用各自的列名替换日期和计数字段。这段代码将根据给定的参数进行分组、求和和和排序。您还可以将频率更改为1米或2米,以此类推
df[['date', 'count']].groupby(pd.Grouper(key='date', freq='1M')).sum().sort_values(by='date', ascending=True)['count']
嗨@EdChum-恢复Monica的身份我如何绘制这些数据?@AdamIqshan抱歉,你应该问一个新问题,而不是使用评论
df[['date', 'count']].groupby(pd.Grouper(key='date', freq='1M')).sum().sort_values(by='date', ascending=True)['count']