
本文介绍如何使用pandas对数值型列按自定义区间(如low/mid/high)及缺失值(nan)进行分组,并对对应计数列求和,涵盖cut、mask和groupby的协同用法。
本文介绍如何使用pandas对数值型列按自定义区间(如low/mid/high)及缺失值(nan)进行分组,并对对应计数列求和,涵盖cut、mask和groupby的协同用法。
在实际数据分析中,常需将连续数值划分为有意义的类别(如“低”“中”“高”),再对关联指标(如像素数量)进行聚合统计。Pandas 提供了高效、灵活的工具链来完成此类任务——核心在于结合 pd.cut() 进行区间分箱、Series.mask() 处理缺失值语义、以及 groupby().sum() 执行聚合。
以下为完整实现步骤与代码:
1. 构建示例数据
import pandas as pd
import numpy as np
df = pd.DataFrame({
'Value': [0.1457, 0.1458, 0.1459, 0.2144, 0.4357, 0.5764, 0.7891, 0.7892, np.nan, np.nan],
'Count': [900, 1800, 900, 1800, 2700, 900, 1800, 900, 0, 0]
})2. 关键处理逻辑解析
- pd.cut():将 Value 列按边界 [-∞, 0.2, 0.6, +∞] 划分为三类,标签设为 ['Low', 'Mid', 'High'];默认丢弃 NaN,因此需配合 dropna=False 保留其分组位置。
- mask():将 Value 为 NaN 对应的 Count 值(原为 0)替换为 1(因每个 nan 行代表一个无数据像素),这是业务逻辑的关键映射。
- groupby(..., dropna=False).sum():确保 NaN 也被视为独立分组参与求和。
3. 一行式聚合(推荐)
result = (
df['Count']
.mask(df['Value'].isna(), 1) # 将 NaN 行的 Count 替换为 1
.groupby(
pd.cut(df['Value'], bins=[-np.inf, 0.2, 0.6, np.inf],
labels=['Low', 'Mid', 'High']),
dropna=False
)
.sum()
.rename_axis('Class')
.reset_index(name='Count')
)
print(result)输出:
Class Count 0 Low 3600 1 Mid 5400 2 High 2700 3 NaN 2
✅ 注意事项:
- 若需将 NaN 分组重命名为 'ND'(No Data),可在最后添加:
result['Class'] = result['Class'].fillna('ND')- 边界 0.2 和 0.6 默认为左开右闭(即 (0.2, 0.6]),若需调整(如包含下界),可传入 right=False 参数。
- dropna=False 必不可少,否则 NaN 分组会被自动忽略。
该方法简洁、向量化、可扩展——只需修改 bins 和 labels 即可适配任意分类策略,是处理数值分段聚合任务的标准实践。


















