如何用Pandas高效实现GroupBy与多维度Agg聚合(含SB列透视)
高效实现分组聚合与SB列转换方案
针对超大型数据集的需求,直接用Pandas的矢量化分组+转置操作就能搞定,完全不用逐行循环,效率拉满:
核心思路
- 先过滤SB范围(确保只保留1-4,减少无效计算)
- 分两步完成聚合:
- 对
Total_Pwr、Channels_Act、Channels_Assigned按LFrame直接求和 - 对
Pwr按LFrame+SB分组求和后,将SB维度转成列(缺失的SB自动填充0)
- 对
- 把两个聚合结果按
LFrame合并,得到最终数据集
代码实现
假设你的数据集是Pandas DataFrame格式,列包含LFrame、SB、Pwr、Total_Pwr、Channels_Act、Channels_Assigned:
import pandas as pd # 过滤SB范围(固定1-4),避免多余数据干扰计算 df = df[df['SB'].isin(range(1, 5))] # 聚合SB对应的Pwr总和,将SB转成列,缺失值填0 sb_pwr_summary = df.groupby(['LFrame', 'SB'])['Pwr'].sum().unstack(level='SB', fill_value=0) # 重命名SB列,方便识别 sb_pwr_summary.columns = [f'SB_{sb}' for sb in sb_pwr_summary.columns] # 聚合其余三个字段的总和 other_summary = df.groupby('LFrame')[['Total_Pwr', 'Channels_Act', 'Channels_Assigned']].sum() # 合并两个结果(索引均为LFrame,直接join即可) final_result = other_summary.join(sb_pwr_summary)
可选简化方案(用pivot_table一步到位)
如果想减少代码行数,也可以用pivot_table一次性完成所有聚合,适合字段较少的场景:
final_result = pd.pivot_table( df[df['SB'].isin(range(1,5))], index='LFrame', values=['Pwr', 'Total_Pwr', 'Channels_Act', 'Channels_Assigned'], columns='SB', aggfunc={ 'Pwr': 'sum', 'Total_Pwr': 'sum', 'Channels_Act': 'sum', 'Channels_Assigned': 'sum' }, fill_value=0 ) # 展平多层列名,方便后续使用 final_result.columns = [f'{metric}_SB_{sb}' if sb is not None else metric for metric, sb in final_result.columns]
效率说明
以上操作都是Pandas的矢量化计算,底层基于C实现,比Python逐行循环快数个数量级,完全适配超大型数据集的处理需求。
内容的提问来源于stack exchange,提问作者earnric
相关产品推荐
相关产品推荐

