如何按DatetimeIndex的小时维度对DataFrame分组,得到单计数列结果?
问题根因
- 执行
new_dh.groupby([new_dh.index.hour]).count()时,pandas默认会对DataFrame内的全部列逐列统计非空值数量。由于示例数据里所有列的行值均无空值,每列的统计结果完全一致,最终就会输出多列内容完全重复的结果,无法得到仅含单个计数列的目标输出。
可行实现方案
方案1:优先使用分组size统计(最贴合需求)
size()会直接统计每个分组下的总行数,不受列空值影响,天然输出单值结果,只需要后续调整结构匹配目标格式即可:
# 按DatetimeIndex的小时维度分组,统计每组行数 result = new_dh.groupby(new_dh.index.hour).size().to_frame(name="count") # 设置索引名称为hour,匹配目标输出格式 result.index.name = "hour"
对示例数据运行后得到的结果值和给定的目标输出完全一致:
count hour 0 2 1 2 2 2 10 1 23 3
如果需要匹配目标输出里的两位补零小时显示效果(如01、02格式),可以在生成结果后追加一行代码,将索引值格式化为两位字符串:
result.index = result.index.astype(str).str.zfill(2)
方案2:指定单列计数(适配count逻辑的场景)
如果习惯使用count统计逻辑,可以在分组时指定单个无空值的列做计数,避免逐列统计的问题:
# 选取任意无空值的列(示例中s-sitename列无空值)做计数 result = new_dh.groupby(new_dh.index.hour)["s-sitename"].count().to_frame(name="count") result.index.name = "hour"
注意:如果选取的列存在空值,count逻辑会过滤掉空值所在行的统计,导致计数结果小于实际请求总数,因此优先推荐使用size方案。
内容的提问来源于stack exchange,提问作者saramarah
相关产品推荐
相关产品推荐

