讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

updream

一键生成高质量推广成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Laper
Laper

剧本策划到成片协作

Pandas DataFrame中高效生成基于分组的唯一ID

浅墨小哥_7661

浅墨小哥_7661

发布时间:2025-09-24 11:08:23

|

211人浏览过

|

来源于php中文网

原创

Pandas DataFrame中高效生成基于分组的唯一ID

本教程详细介绍了如何在Pandas DataFrame中,基于现有两列(如Name和ID)高效创建新的唯一组合ID。针对传统方法如ngroup()和cumcount()的局限性,本文提出了利用pandas.factorize结合groupby().transform()函数,为每个ID组内的Name实例生成递增的唯一后缀,最终构建出ID_新后缀格式的组合ID,尤其适用于处理大规模数据集。

一、背景与挑战

在数据处理和分析中,我们经常需要为数据集中的记录生成唯一的标识符。当这些标识符需要基于多列信息,并且要求在某一列(如id)的分组内,根据另一列(如name)的出现顺序或唯一性来生成时,问题会变得复杂。例如,给定一个dataframe,其中包含name和id两列:

Name ID
A 1
B 2
A 1
C 3
B 2
D 3
E 1
F 2

我们的目标是创建一个新的ID_new列,其格式为原始ID_后缀,其中后缀表示该Name在对应ID组内的唯一实例序号。例如,ID=1的第一个A和第二个A都应对应1_1,而ID=3的C是第一个Name,D是第二个Name,则分别对应3_1和3_2。

传统的Pandas方法如groupby().ngroup()虽然可以生成组内序号,但它为每个组生成一个唯一的整数,不适用于我们这种需要保留原始ID并添加后缀的场景。而groupby().cumcount()则会为每个组内的行生成递增序号,导致对于相同的Name在同一ID组内产生不同的后缀(例如,ID=1的两个A会分别得到1_1和1_2),这不符合我们的“唯一实例”要求。此外,对于拥有数万甚至数十万个ID的大规模数据集,某些方法可能会面临性能瓶颈。

二、解决方案:结合 factorize 与 groupby().transform()

解决此类问题的有效方法是利用pandas.factorize函数在groupby().transform()的上下文中使用。factorize函数能够将数组中的唯一值映射为整数编码,这正是我们所需的“唯一实例序号”。transform()则确保了操作结果能够正确地对齐回原始DataFrame的索引。

2.1 核心原理

  1. 分组 (groupby('ID')): 首先,根据ID列对DataFrame进行分组。
  2. 组内应用函数 (transform(f)): 对于每个ID组,我们只关注Name列。transform()函数会将一个函数应用于每个组的Name列,并返回一个与原始DataFrame具有相同索引的Series。
  3. factorize 生成后缀: 在transform中应用的函数f会调用pd.factorize(x)[0] + 1。
    • pd.factorize(x)会返回一个元组,其中第一个元素是整数数组,代表x中唯一值的编码。例如,['A', 'B', 'A', 'C']经过factorize可能得到[0, 1, 0, 2]。
    • [0]用于提取这个整数数组。
    • + 1是为了让序号从1开始,而非0。
    • 这样,对于每个ID组,factorize会为该组内出现的每个唯一Name分配一个唯一的、从1开始的整数后缀。
  4. 拼接 (str.cat): 最后,将原始的ID列(转换为字符串)与生成的后缀(也转换为字符串)通过分隔符_进行拼接,形成新的ID_new列。

2.2 示例代码

让我们通过一个具体的例子来演示这个过程。

Python Hardener
Python Hardener

通过完整的安全审查、代码整洁重构、健壮的错误处理、正确的日志记录以及完整的文档字符串覆盖,强化 Python 脚本。

下载
import pandas as pd

# 准备示例数据
data = {
    'Name': ['A', 'B', 'A', 'C', 'B', 'D', 'E', 'F'],
    'ID': [1, 2, 1, 3, 2, 3, 1, 2]
}
df = pd.DataFrame(data)

print("原始 DataFrame:")
print(df)

# 定义一个lambda函数,用于在每个组内对Name列进行factorize编码
# factorize返回的第一个元素是编码数组,我们将其加1使其从1开始计数
f = lambda x: pd.factorize(x)[0] + 1

# 使用groupby().transform()在每个ID组内生成Name的唯一序号
# transform确保了结果Series的索引与原始DataFrame对齐
s = df.groupby('ID')['Name'].transform(f).astype(str)

# 将原始ID列转换为字符串,并与生成的后缀进行拼接
df['ID_new'] = df['ID'].astype(str).str.cat(s, sep='_')

print("\n生成 'ID_new' 列后的 DataFrame:")
print(df)

输出结果:

原始 DataFrame:
  Name  ID
0    A   1
1    B   2
2    A   1
3    C   3
4    B   2
5    D   3
6    E   1
7    F   2

生成 'ID_new' 列后的 DataFrame:
  Name  ID ID_new
0    A   1    1_1
1    B   2    2_1
2    A   1    1_1
3    C   3    3_1
4    B   2    2_1
5    D   3    3_2
6    E   1    1_2
7    F   2    2_2

从结果可以看出,ID=1的两个A都得到了1_1,而ID=3的C得到3_1,D得到3_2,这完全符合我们的预期。ID=1的E由于是ID=1组内第一次出现E,因此得到1_2(因为A已经占用了1)。

三、注意事项与性能考量

  1. 数据类型转换: 在拼接字符串之前,务必将ID列和生成的后缀Series都转换为字符串类型(astype(str)),否则str.cat方法可能无法正常工作。
  2. 性能优势: pd.factorize在底层使用优化的C语言实现,效率非常高。结合groupby().transform(),这种方法能够高效地处理大规模数据集,避免了Python循环的开销,尤其适用于拥有大量分组和记录的场景。相比于ngroup()或cumcount()在特定逻辑下的局限性,此方法提供了更精确和高效的解决方案。
  3. 灵活性: 分隔符sep='_'可以根据需求进行调整。如果需要更复杂的后缀生成逻辑,也可以修改lambda函数中的factorize部分,或者替换为其他自定义函数。
  4. factorize的顺序: factorize的编码顺序取决于元素在输入Series中第一次出现的顺序。这意味着如果ID=1组中先出现A,再出现E,那么A会得到1,E会得到2。如果数据顺序发生变化,编码结果可能也会变化,但对于“唯一实例”的语义是保持一致的。

四、总结

本文介绍了一种在Pandas DataFrame中高效生成基于分组的唯一组合ID的专业方法。通过巧妙地结合pandas.factorize函数与groupby().transform()操作,我们能够克服传统方法的局限性,为每个分组内的独特实例生成正确的递增后缀,并将其与原始ID进行拼接。这种方法不仅逻辑清晰、易于理解,而且在处理大规模数据集时表现出卓越的性能,是数据科学家和工程师在处理类似需求时的理想选择。

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

360

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

272

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

871

2026.04.13

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3431

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

574

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

582

2026.02.12

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

17420

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1243

2024.02.23

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

40

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn