pandas按年、月两列分组统计第三列不同值出现次数的实现方法
问题原因
你之前的groupby+aggregate写法无法拆分统计结果,是因为aggregate({"register": pd.Series.value_counts})会把每组的yes、no计数合并为单个列输出,不会单独生成两个值的统计项。
正确实现
使用修正后的链式调用写法即可实现需求,先按year、month分组,再指定对register列做值计数:
counts = df_registration.groupby(["year", "month"])["register"].value_counts()
输出结果会生成三级索引:前两级为year、month,第三级为register的取值(yes/no),对应值为各分组下对应取值的出现次数。
扩展:适配预期宽表格式
如果需要实现每个年月对应一行、yes和no分别为单独列的格式,可以在上述代码后追加unstack方法,自动将第三级索引转为列:
# fill_value=0 可将无对应取值的分组计数填充为0,避免生成空值 counts = df_registration.groupby(["year", "month"])["register"].value_counts().unstack(fill_value=0)
如果只需要保留yes的统计列,再做一次列筛选即可:
yes_counts = counts[['yes']]
内容的提问来源于stack exchange,提问作者jeernejc
相关产品推荐
相关产品推荐

