如何高效对Pandas DataFrame执行聚合函数计算带宽使用率?
高效计算设备带宽使用率的Pandas实现
给定如下Pandas DataFrame:
import pandas as pd data = { 'Device': ['Usa123', 'Usa123', 'Emea01', 'Emea01'], 'int': ['Eth1', 'Eth0', 'Wan1', 'Eth3'], 'In': [1000, 10000, 1000, 2000], 'Out': [500, 700, 500, 1000], 'Bw_in': [100, 200, 150, 200], 'Bw_out': [75, 80, 90, 70] } df = pd.DataFrame(data)
需求是按Device分组计算带宽使用率:
%InUsage= 设备总Bw_in/ 设备总In%OutUsage= 设备总Bw_out/ 设备总Out
结果仅在每组的第一行显示计算值,其余行留空,目标格式如下:
Device int In Out Bw_in Bw_out %InUsage %OutUsage Usa123 Eth1 1000 500 100 75 0.01 0.12 Usa123 Eth0 10000 700 200 80 NaN NaN Emea01 Wan1 1000 500 150 90 0.11 0.10 Emea01 Eth3 2000 1000 200 70 NaN NaN
你当前尝试的代码:
df.groupby('Device').apply(lambda x: sum(x['Bw_in'])/sum(x['In']))
更高效的实现方式
使用groupby.transform替代apply,transform会将聚合结果广播到原DataFrame的每一行,避免apply的循环开销,在大数据量场景下性能优势明显:
# 计算每组的聚合总和,广播到对应组的所有行 df['total_Bw_in'] = df.groupby('Device')['Bw_in'].transform('sum') df['total_In'] = df.groupby('Device')['In'].transform('sum') df['total_Bw_out'] = df.groupby('Device')['Bw_out'].transform('sum') df['total_Out'] = df.groupby('Device')['Out'].transform('sum') # 计算带宽使用率 df['%InUsage'] = df['total_Bw_in'] / df['total_In'] df['%OutUsage'] = df['total_Bw_out'] / df['total_Out'] # 仅保留每组第一行的计算值,其余行置空 group_first_rows = df.groupby('Device').head(1).index df.loc[~df.index.isin(group_first_rows), ['%InUsage', '%OutUsage']] = pd.NA # 清理临时计算列 df = df.drop(['total_Bw_in', 'total_In', 'total_Bw_out', 'total_Out'], axis=1)
为什么这是更优方案?
- 性能更高:
transform是Pandas原生向量化操作,比apply的自定义lambda循环执行速度快数倍,尤其处理十万级以上数据时差距明显 - 可读性更强:分步计算逻辑清晰,便于后续维护和调试
- 扩展性更好:如果需要新增其他分组聚合指标,只需添加对应的
transform计算即可
内容的提问来源于stack exchange,提问作者user1471980
相关产品推荐
相关产品推荐

