Pandas按每日各小时分组统计列中Top5高频值实现方法
Pandas按小时分组取B列Top5高频值实现
问题背景
现有Pandas数据集样例如下:
| Date | A | B |
|---|---|---|
| 2021-05-06 12.00 | 18.5 | 0 |
| 2021-05-06 13.00 | 20.3 | 9.7% |
| 2021-05-06 14.00 | 16.1 | -20.7% |
| 2022-05-06 10.00 | 50.4 | 4.0% |
| 2022-05-06 11.00 | 52.4 | 3.9% |
需求:按一天中的小时维度分组,提取每个分组下B列出现频率最高的最多5个值;若分组下B列不同值不足5个,返回实际存在的所有高频值,最终输出格式参考如下示例:
| hour | most common value |
|---|---|
| 0.00 | +3%, 7%, -9%, 0.5%, 18% |
| 12.00 | +6%, -3%, 4% |
| 13.00 | 1, 4% |
实现代码
核心逻辑
- 先将字符串格式的
Date列解析为标准时间类型,提取和输出格式一致的小时字段 - 按小时分组,对每个分组的B列做频次统计,取频次最高的前5个值拼接为字符串
- 频次统计方法自动处理分组内值不足5个的场景,无需额外写判断逻辑
可直接运行的代码
import pandas as pd # 解析时间字段,提取符合输出格式的小时列 df['Date'] = pd.to_datetime(df['Date'], format='%Y-%m-%d %H.%M') df['hour'] = df['Date'].dt.strftime('%H.00') # 定义分组统计TopN高频值的函数 def get_topn_common(series, top_n=5): top_values = series.value_counts().head(top_n).index.tolist() return ', '.join(map(str, top_values)) # 分组计算得到最终结果 result = df.groupby('hour', as_index=False)['B'].apply(get_topn_common) result.columns = ['hour', 'most common value']
结果说明
用提供的样例数据运行上述代码,输出结果如下(因样例中每个小时仅1条数据,所以每个分组仅返回1个值,符合不足5个返回实际值的要求):
| hour | most common value |
|---|---|
| 10.00 | 4.0% |
| 11.00 | 3.9% |
| 12.00 | 0 |
| 13.00 | 9.7% |
| 14.00 | -20.7% |
如果需要过滤空值,只需要在get_topn_common函数开头增加series = series.dropna()即可。
内容的提问来源于stack exchange,提问作者andru
相关产品推荐
相关产品推荐

