如何在Pandas中批量计算多列与Band列的比值并统计使用率区间
解决方案
1. 批量计算各日期使用率
直接通过列索引定位Band右侧的所有日期列,利用Pandas广播机制批量完成除法运算,不用逐列手动处理:
import pandas as pd # 构造示例数据(已有目标DataFrame可跳过此步) data = { 'Node': ['Server1', 'Server2', 'Server3'], 'Band': [10000, 30000, 17000], '5-May': [800, 600, 1500], '12-May': [1000, 3000, 12000], '19-May': [12000, 12000, 12500], '26-May': [12500, 12500, 500], '2-June': [500, 500, 1000] } df = pd.DataFrame(data) # 批量处理日期列:所有日期列数值除以对应行的Band值 date_cols = df.columns[2:] # 自动获取Band之后的所有列 df[date_cols] = df[date_cols].div(df['Band'], axis=0) # 可选:保留两位小数让结果更整洁 df[date_cols] = df[date_cols].round(2)
执行后就能得到你需要的使用率DataFrame。
2. 按节点统计各使用率区间次数
先把宽表转成长表,再用分箱函数按指定区间统计频次:
# 定义统计区间及对应标签 bins = [0.7, 0.8, 0.9, 1.0, float('inf')] labels = ['70%-80%', '80%-90%', '90%-100%', '100%+'] # 将日期列转为长格式,方便按节点聚合所有使用率数据 df_melted = df.melt(id_vars=['Node'], value_vars=date_cols, var_name='Date', value_name='Usage') # 分组分箱并统计各区间次数 usage_counts = df_melted.groupby('Node')['Usage'].apply( lambda x: pd.cut(x, bins=bins, labels=labels, include_lowest=True).value_counts() ).unstack(fill_value=0) # 重置索引让结果结构更清晰 usage_counts = usage_counts.reset_index()
最终usage_counts会展示每个节点在各区间的次数,比如Server1的100%+区间次数为2,和示例一致。
关键说明
df.columns[2:]自动适配任意数量的日期列,无需手动指定列名;melt转换长表是为了统一处理所有日期的使用率数据,避免逐列统计;include_lowest=True确保区间左边界值(如0.7)会被正确归入对应区间。
内容的提问来源于stack exchange,提问作者user1471980
相关产品推荐
相关产品推荐

