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

如何使用Pandas Groupby按自定义区间对DataFrame的c列分组并聚合?

使用Pandas Groupby高效实现区间分组聚合

完全可以用groupby高效搞定这个需求,而且代码比字典映射更简洁、可读性更强!核心思路是先用pd.cut()把c列按指定区间分箱,再直接基于分箱结果做分组聚合,这也是pandas处理区间分组的标准做法。

完整实现代码

import pandas as pd

# 初始化你的DataFrame
df = pd.DataFrame(columns=['a','b','c','d'], 
                  data=[[2, 1,1, 3], [4, 2,3, 7], [2, 4,7, 9], [3, 2,9, 11], [4, 3,11,15], [5, 5,15,20], [10,3,20,30]])
cuts = [3,11]

# 1. 对c列进行区间分箱,生成分组标签
df['group'] = pd.cut(
    df['c'],
    bins=[-float('inf')] + cuts + [float('inf')],  # 扩展区间确保所有数据被覆盖
    labels=['c < 3', '3 ≤ c < 11', 'c > 11'],      # 自定义分组名称,方便理解
    include_lowest=True  # 确保左边界值(比如c=3)被包含在第二个组里
)

# 2. 按分组列执行聚合操作
agg_result = df.groupby('group', as_index=False).agg(
    a_total=('a', 'sum'),    # a列求和,结果列命名为a_total
    b_max=('b', 'max'),      # b列取最大值,结果列命名为b_max
    d_max=('d', 'max')       # d列取最大值,结果列命名为d_max
)

print(agg_result)

代码细节解释

  1. 区间分箱pd.cut():

    • 我们给bins添加了-inf和inf,确保所有c列的数据都能被分到对应的组里,不会出现数据遗漏。
    • labels参数自定义了分组的名称,让最终结果更直观,避免默认的区间字符串(比如(-inf, 3])。
    • include_lowest=True确保左边界值(比如c=3)被正确包含在3 ≤ c < 11这个组里,符合你的需求定义。
  2. 分组聚合groupby().agg():

    • 这里用了pandas的命名聚合(版本0.25+支持),可以直接指定聚合后的列名和对应的(原列名,聚合函数),代码逻辑非常清晰。
    • as_index=False让分组列不会成为结果的索引,返回一个普通的DataFrame,更符合常规使用习惯。

运行结果

执行代码后会输出:

group  a_total  b_max  d_max
0        c < 3        2      1      3
1  3 ≤ c < 11        9      4     11
2       c > 11       19      5     30

完全符合你要求的分组规则和聚合逻辑。

这种方式比字典映射更高效,因为groupby是pandas底层优化过的操作,处理大数据量时性能优势明显,同时代码更简洁易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:17:48