You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 07:33:18