如何使用Python groupby实现按区间统计生成数据汇总表
Python groupby区间条件统计实现方案
核心思路
利用pandas分组聚合时,布尔值求和等价于符合条件的记录计数的特性,直接在agg方法中定义各区间的统计逻辑。
完整可运行代码
import pandas as pd # ---------------------- 1. 加载数据 ---------------------- # 测试用模拟数据,实际使用时替换为你的数据读取逻辑,比如 pd.read_csv("你的文件路径") data = [ ['Delhi', 'del51-del63', 15.11], ['Delhi', 'del51-del63', 17], ['Delhi', 'del51-del63', 34.82285714], ['Delhi', 'del51-del63', 34.82285714], ['Mumbai', 'mum1012-mum233', 42], ['Mumbai', 'mum412-mum2121', 42.15], ['Mumbai', 'mum1012-mum245', 58.82285714], ['Mumbai', 'mum10-mum2121', 77.52], ['Delhi', 'del51-del61', 81], ['Delhi', 'del51-del62', 88], ['Mumbai', 'mum1012-mum2121', 95] ] df = pd.DataFrame(data, columns=['Circle', 'Link', 'Utilization']) # ---------------------- 2. 分组聚合统计 ---------------------- result = df.groupby('Circle').agg( # 统计每个Circle的总记录数 Link_count = ('Utilization', 'count'), # 统计各区间的数量,用**解包字典兼容含特殊符号的列名 **{'<50': ('Utilization', lambda x: sum(x < 50))}, **{'>=50 & <80': ('Utilization', lambda x: sum((x >= 50) & (x < 80)))}, **{'>=80': ('Utilization', lambda x: sum(x >= 80))} ).reset_index() # ---------------------- 3. 输出结果 ---------------------- print(result) # 如果需要导出为表格格式可以用:result.to_csv("统计结果.csv", index=False)
输出结果验证
运行代码后得到的结果和预期完全一致:
| Circle | Link_count | <50 | >=50 & <80 | >=80 |
|---|---|---|---|---|
| Delhi | 6 | 4 | 0 | 2 |
| Mumbai | 5 | 2 | 2 | 1 |
扩展方案(多区间场景更友好)
如果后续需要统计的区间更多,可以用pd.cut先给每条记录打区间标签再统计,代码更简洁:
# 定义区间和对应标签 bins = [-float('inf'), 50, 80, float('inf')] labels = ['<50', '>=50 & <80', '>=80'] df['区间'] = pd.cut(df['Utilization'], bins=bins, labels=labels) # 分组统计 result = df.groupby('Circle').agg(Link_count=('区间', 'count'))\ .join(df.groupby(['Circle', '区间']).size().unstack(fill_value=0))\ .reset_index()
内容的提问来源于stack exchange,提问作者Sudarshan Waman
相关产品推荐
相关产品推荐

