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

在Pandas中为分组分配唯一数值型组ID

给Pandas分组分配唯一数值型ID的简便方法

嘿,这个需求我简直天天碰到!给Pandas分组分配唯一数值ID确实比拼接列靠谱太多——毕竟拼接不仅容易因为列多、值类型复杂出问题,还平白浪费内存。下面给你几个简单好用的方法,直接就能上手:

方法1:用groupby.ngroup()(最直接)

这是Pandas专门为分组场景设计的方法,一步就能生成连续的数值ID,完全不需要手动处理拼接。它默认从0开始分配ID,还能通过参数控制排序和起始值。

示例代码:

import pandas as pd

# 构造示例数据集
df = pd.DataFrame({
    'category': ['A', 'A', 'B', 'B', 'A', 'C'],
    'subcategory': ['X', 'X', 'Y', 'Y', 'Z', 'X'],
    'value': [10, 20, 30, 40, 50, 60]
})

# 按多列分组并生成唯一ID
df['group_id'] = df.groupby(['category', 'subcategory']).ngroup()

# 如果想让ID从1开始,或者按分组键排序后分配ID:
# df['group_id_sorted'] = df.groupby(['category', 'subcategory']).ngroup(start=1, sort=True)

结果说明:

分组A-X会得到ID 0,A-Z是1,B-Y是2,C-X是3——完全按分组出现的顺序分配,没有冗余字符串,内存占用极低。

方法2:用pd.factorize()(更灵活)

如果不想先做groupby操作,或者需要单独处理分组键的组合,factorize()是个好选择。它能把任意可哈希的序列(包括元组)转换成唯一数值编码。

示例代码:

# 直接对多列组合的元组进行编码
df['group_id_factorize'] = pd.factorize(df[['category', 'subcategory']].apply(tuple, axis=1))[0]

进阶优化(大数据集适用):

如果你的数据集很大,apply(tuple)可能有点慢,可以用向量化的哈希方法替代:

from pandas.api.types import hash_pandas_object

# 对分组列生成哈希值,再通过rank得到连续的ID
df['group_id_hash'] = hash_pandas_object(df[['category', 'subcategory']], index=False).rank(method='dense').astype(int) - 1

这个方法完全避免了循环操作,处理百万级数据也很快。

各方法对比

方法优点适用场景
groupby.ngroup()代码最简洁,支持排序/起始值设置已经在进行分组操作的场景
pd.factorize()无需提前groupby,灵活处理任意分组键需要单独处理分组键组合的场景
哈希+rank向量化操作,效率极高,适合大数据集超大规模数据集,追求性能的场景

这些方法都完美避开了拼接列的弊端:不会生成冗余字符串,内存占用极小,而且能保证每个分组的ID绝对唯一——不管你的分组列有多少、值是什么类型都能搞定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:54:45