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

如何用Pandas按time分组后基于组内value极值切分区间并聚合?

问题描述

现有如下Pandas DataFrame:

import pandas as pd
df = pd.DataFrame({'time' : [1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
                   'value' : [0.10, 0.25, 0.40, 0.24, 0.20, 0.36, 0.31, 0.20, 0.32, 0.40],
                   'quantity_A' : [1, 2, 3, 1, 2, 1, 1, 2, 1, 1],
                   'quantity_B' : [2, 2, 3, 4, 2, 2, 3, 4, 1, 1]})

需要完成以下操作:

  • 按time字段分组
  • 每组内以value字段的最小值和最大值为范围,指定步长(如0.1)切分区间
  • 将quantity_A和quantity_B按分组与对应区间求和
  • 输出两种可选格式

当前通过手动迭代实现,效率极低,希望用Pandas的groupby、cut等函数优化实现。

优化实现方案

可以利用groupby.apply结合pd.cut实现,完全替代手动迭代,充分利用Pandas向量化运算提升效率。以下是具体实现:

1. 定义分组处理函数

该函数负责单个分组内的区间划分、求和逻辑:

def process_group(group, step=0.1):
    # 获取当前组value字段的极值
    min_val = group['value'].min()
    max_val = group['value'].max()
    
    # 生成区间边界:从min_val开始,按步长step生成直到覆盖max_val
    bins = []
    current = min_val
    # 加step/2偏移避免浮点精度问题导致max_val被遗漏
    while current <= max_val + step/2:
        bins.append(current)
        current += step
    
    # 给每个value分配对应的区间
    group['value_bin'] = pd.cut(
        group['value'], 
        bins=bins, 
        right=False,  # 左闭右开区间
        include_lowest=True  # 确保最小值被包含在第一个区间
    )
    
    # 按区间分组求和quantity_A和quantity_B
    result = group.groupby('value_bin')[['quantity_A', 'quantity_B']].sum().reset_index()
    # 保留当前分组的time标识
    result['time'] = group['time'].iloc[0]
    return result

2. 执行分组处理

调用groupby.apply对每个time分组应用上述函数:

processed_df = df.groupby('time').apply(process_group, step=0.1).reset_index(drop=True)

可选输出格式1:长格式(默认结果)

每个分组-区间的求和结果为单独一行,适合后续分析:

print("长格式输出:")
print(processed_df)

输出示例:

value_bin  quantity_A  quantity_B  time
0  [0.1, 0.2)            1           2     1
1  [0.2, 0.3)            5           8     1
2  [0.3, 0.4]            3           3     1
3  [0.2, 0.3)            2           4     2
4  [0.3, 0.4]            3           6     2

可选输出格式2:宽格式

将quantity_A和quantity_B作为列,time和区间作为索引,适合直观查看:

# 先转换为熔接格式,再转置为宽表
melted = processed_df.melt(
    id_vars=['time', 'value_bin'],
    value_vars=['quantity_A', 'quantity_B'],
    var_name='quantity_type',
    value_name='sum_value'
)
wide_format = melted.pivot(
    index=['time', 'value_bin'],
    columns='quantity_type',
    values='sum_value'
).reset_index()

print("\n宽格式输出:")
print(wide_format)

输出示例:

quantity_type  time   value_bin  quantity_A  quantity_B
0                  1  [0.1, 0.2)            1           2
1                  1  [0.2, 0.3)            5           8
2                  1  [0.3, 0.4]            3           3
3                  2  [0.2, 0.3)            2           4
4                  2  [0.3, 0.4]            3           6

关键优化点

  • 用groupby.apply替代手动循环,完全利用Pandas内部优化的运算逻辑
  • pd.cut参数设置确保区间划分的准确性,避免浮点精度问题
  • 所有操作均为向量化处理,比手动迭代效率提升显著

内容的提问来源于stack exchange,提问作者Korborb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:45:42