如何基于列值范围动态为Pandas DataFrame每行分配组编号?
动态分组解决方案
直接用Pandas的pd.cut和factorize组合就能实现动态分组,不用硬编码所有条件,步骤如下:
步骤1:定义col_1的区间配置
先把col_1的区间和对应标签(可选)定义成变量,后续要调整区间直接改这里就行:
import pandas as pd # 定义col_1的区间(左闭右开,最后一个区间用inf表示无穷大) col1_bins = [0, 10, 15, 20, float('inf')] # 给每个区间起易识别的标签(也可以省略,直接用区间字符串) col1_labels = ['0-10', '11-15', '16-20', '20+']
步骤2:对col_1进行区间划分
用pd.cut把col_1的值映射到对应的区间标签:
df['col1_group'] = pd.cut(df['col_1'], bins=col1_bins, labels=col1_labels, include_lowest=True)
include_lowest=True确保0这类边界值被正确包含在第一个区间里。
步骤3:合并分组条件并生成组编号
把col_1的区间分组和col_2的值合并成唯一组合键,再用pd.factorize给每个组合分配唯一的组编号:
# 组合两个条件成唯一键 df['group_key'] = df['col1_group'].astype(str) + '_' + df['col_2'].astype(str) # 生成组编号(从0开始,如需从1开始可加:+1) df['group_id'], _ = pd.factorize(df['group_key'])
完整示例代码
import pandas as pd d = {'ID': [100, 101, 102, 103, 104, 105], 'col_1': [12, 3, 7, 13, 19, 25], 'col_2': [3, 1, 3, 3, 2, 4] } df = pd.DataFrame(data=d) # 动态定义col_1的区间和标签 col1_bins = [0, 10, 15, 20, float('inf')] col1_labels = ['0-10', '11-15', '16-20', '20+'] # 划分col_1区间 df['col1_group'] = pd.cut(df['col_1'], bins=col1_bins, labels=col1_labels, include_lowest=True) # 生成组编号 df['group_key'] = df['col1_group'].astype(str) + '_' + df['col_2'].astype(str) df['group_id'], _ = pd.factorize(df['group_key']) # 查看结果 print(df[['ID', 'col_1', 'col_2', 'group_id']])
输出结果
ID col_1 col_2 group_id 0 100 12 3 0 1 101 3 1 1 2 102 7 3 2 3 103 13 3 0 4 104 19 2 3 5 105 25 4 4
可以看到第0行和第3行因col_1同属[11,15]区间、col_2均为3,被分到同一组(group_id=0)。
动态扩展说明
- 调整col_1区间:直接修改
col1_bins和col1_labels即可,无需改动后续逻辑; - col_2新增值:
factorize会自动识别并分配新组编号,不用提前预定义所有可能值; - 新增分组条件:只需在
group_key里追加对应列的字符串转换即可,比如加上col_3:df['group_key'] = df['col1_group'].astype(str) + '_' + df['col_2'].astype(str) + '_' + df['col_3'].astype(str)
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

