如何使用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)
代码细节解释
区间分箱
pd.cut():- 我们给
bins添加了-inf和inf,确保所有c列的数据都能被分到对应的组里,不会出现数据遗漏。 labels参数自定义了分组的名称,让最终结果更直观,避免默认的区间字符串(比如(-inf, 3])。include_lowest=True确保左边界值(比如c=3)被正确包含在3 ≤ c < 11这个组里,符合你的需求定义。
- 我们给
分组聚合
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
相关产品推荐
相关产品推荐

