基于索引范围聚合Pandas数据:分箱求均值与求和
大型DataFrame分箱处理方案
问题背景
有一个包含5万多行的大型DataFrame,示例数据如下:
CallType Broadcast C1 C2 Csk Data Netd2 Net3 OpenP1 OpenP2 OpenP8 SBD Voice LFrame 0 85.811985 0.820731 0.479020 0.550982 23.95 0.0 4.79 32.338503 23.573862 8.462412 6.696933 3.781450 22 0.000000 1.143358 0.303666 0.375464 28.74 0.0 9.58 29.013984 32.640732 8.462412 5.993194 2.666097 44 99.160516 0.918363 0.889132 0.489427 28.74 0.0 4.79 28.107297 33.849648 6.044580 4.790000 0.000000 66 0.000000 0.923886 0.983070 0.675550 28.74 0.0 9.58 27.805068 27.805068 5.440122 13.328801 4.984644
需求:按binsize=600对索引LFrame进行分箱(每组600行),生成的新DataFrame中:
LFrame取每组的平均值作为新索引- 其余所有列取每组的求和值
尝试过pivot_table和groupby方法未实现需求,期望结果格式如下:
CallType Broadcast Certus1 Certus2 Certus8apsk Data Netted2 Netted3 OpenPort1 OpenPort2 OpenPort8 ShortBurstData Voice LFrame 300 585.811985 440.820731 0.479020 340.550982 4323.95 0.0 4.79 3332.338503 23.573862 308.462412 346.696933 7733.781450 900 1230.0000 341.143358 430.303666 430.375464 2448.74 0.0 9.58 3329.013984 32.640732 408.462412 345.993194 942.666097 1200 4099.160516 340.918363 730.889132 430.489427 4428.74 0.0 4.79 4428.107297 33.849648 406.044580 434.790000 340.0000 1500 400.0000 340.923886 0.983070 4430.675550 3428.74 0.0 9.58 2447.805068 2437.805068 4405.440122 343413.328801 334.984644
解决方案
通过手动创建分组键结合groupby的自定义聚合逻辑即可实现,步骤如下:
代码实现
# 重置索引,将原索引LFrame转为列便于处理 df_reset = df.reset_index() # 定义分箱大小,生成分组键:每600行一组 binsize = 600 df_reset['group'] = df_reset.index // binsize # 自定义聚合规则:LFrame取均值,其余列取求和 agg_result = df_reset.groupby('group').agg( LFrame=('LFrame', 'mean'), **{col: (col, 'sum') for col in df_reset.columns if col not in ['LFrame', 'group']} ) # 将LFrame设置为新索引,匹配需求格式 agg_result = agg_result.set_index('LFrame') # 若需要将索引值取整(和示例中的300、900一致),可添加以下代码 # agg_result.index = agg_result.index.round().astype(int)
关键说明
- 按行号分组:用
df_reset.index // binsize生成分组键,确保严格按每600行一组划分,不受LFrame数值是否连续的影响 - 批量聚合规则:通过字典推导式自动生成所有非目标列的求和规则,避免手动罗列列名
- 索引转换:重置索引后处理聚合,再将
LFrame均值设为新索引,完全匹配需求格式
内容的提问来源于stack exchange,提问作者earnric
相关产品推荐
相关产品推荐

