如何在Pandas中按服务器分组统计带宽使用率区间出现次数
Pandas实现带宽使用率区间统计
原始数据
初始带宽使用量DataFrame df
Server Bandwidth 1-Jun 6-June 12-Jun 1-Jul ServerA 10000 5000 6000 7500 8000 ServerB 100000 60000 80000 75000 80000 ServerC 20000 5000 6000 7500 8000 ServerD 30000 5000 6000 7500 8000 ServerF 10000 5000 6000 7500 8000 ServerX 5000 5000 6000 7500 8000
计算后的带宽使用率DataFrame out
Server Bandwidth 1-Jun 6-June 12-Jun 1-Jul ServerA 10000 0.50 0.60 0.75 0.80 ServerB 100000 0.60 0.80 0.75 0.80 ServerC 20000 0.25 0.30 0.38 0.40
实现步骤与代码
1. 定义区间规则
先指定使用率的划分区间和对应标签:
import pandas as pd # 定义区间边界(左闭右开,最后一个区间包含所有大于1.0的值) bins = [0.7, 0.8, 0.9, 1.0, float('inf')] # 对应区间标签 labels = ["70%-80%", "80%-90%", "90%-100%", "100%+"]
2. 将宽表转为长表
把日期列拆成单独的行,方便后续按服务器和区间统计:
# 提取日期列(排除Server和Bandwidth) date_cols = out.columns[2:] # 转长表 melted_df = out.melt( id_vars=['Server', 'Bandwidth'], value_vars=date_cols, var_name='Date', value_name='Usage_Rate' )
3. 划分使用率区间
为每条使用率数据匹配对应的区间:
# 添加区间列 melted_df['Usage_Interval'] = pd.cut( melted_df['Usage_Rate'], bins=bins, labels=labels, include_lowest=False # 不包含左边界以下的值,即低于70%的不计入统计 )
4. 分组统计区间次数
按服务器分组,统计每个区间的出现次数,并转成目标宽表格式:
# 按Server和Usage_Interval分组统计,重置索引 count_df = melted_df.groupby(['Server', 'Usage_Interval']).size().reset_index(name='Count') # 转宽表,填充缺失区间的计数为0 result_df = count_df.pivot( index='Server', columns='Usage_Interval', values='Count' ).fillna(0).astype(int) # 合并Bandwidth列并调整列顺序 result_df = result_df.merge(out[['Server', 'Bandwidth']], on='Server', how='left').set_index('Server') result_df = result_df[['Bandwidth'] + labels]
最终结果示例
运行后result_df会呈现如下格式:
Bandwidth 70%-80% 80%-90% 90%-100% 100%+ ServerA 10000 1 1 0 0 ServerB 100000 1 2 0 0 ServerC 20000 0 0 0 0
内容的提问来源于stack exchange,提问作者user1471980
相关产品推荐
相关产品推荐

