0

0

Pandas数据处理:高效生成分组内唯一ID的策略

霞舞

霞舞

发布时间:2025-09-24 13:27:00

|

997人浏览过

|

来源于php中文网

原创

Pandas数据处理:高效生成分组内唯一ID的策略

本文介绍了一种使用Pandas高效为DataFrame生成分组内唯一复合ID的方法。针对现有ID列和名称列,当需要在每个原始ID组内为不同名称实例创建顺序后缀时,传统的ngroup()或cumcount()可能效率低下或不适用。本教程将详细讲解如何结合groupby().transform()与pd.factorize()函数,以简洁且高性能的方式实现这一需求,生成形如'ID_序号'的全新标识符。

在数据处理和分析中,我们经常面临需要为数据集中的记录生成唯一标识符的场景。特别是在处理具有分组结构的数据时,可能需要在每个分组内部为特定的列值创建递增的序列号,并将其与原始分组标识符组合,形成一个新的复合id。例如,在一个包含“id”和“name”列的dataframe中,我们希望为每个“id”分组内的不同“name”生成一个唯一的后缀,从而构建形如“原始id_序号”的新id。

传统的DataFrame.groupby().ngroup()方法可以为每个分组生成一个唯一的组号,但这并非我们所需的“原始ID_序号”格式。而GroupBy.cumcount()虽然能生成组内累积计数,但它会为每个实例递增,无法实现对相同“Name”在同一组内保持相同序号的需求,且对于大型数据集,直接迭代或低效操作可能导致性能瓶颈。本教程将介绍一种结合pd.factorize()和GroupBy.transform()的专业且高效的解决方案。

核心概念:factorize与transform

要高效地实现这一目标,我们需要理解并利用Pandas的两个强大功能:pd.factorize()和GroupBy.transform()。

  1. pd.factorize()函数pd.factorize(values)是一个非常实用的函数,它能够将一个Series或数组中的类别值编码为数值型因子。它返回一个元组:

    • 第一个元素是一个整数数组,表示每个原始值对应的因子编码。
    • 第二个元素是一个Index对象,包含所有唯一的原始值。 例如,pd.factorize(['A', 'B', 'A', 'C'])会返回(array([0, 1, 0, 2]), Index(['A', 'B', 'C'], dtype='object'))。利用这个特性,我们可以为每个组内的唯一“Name”分配一个唯一的整数。
  2. GroupBy.transform()方法GroupBy.transform(func)方法用于对分组数据应用一个函数,并将结果广播回原始DataFrame的索引。与agg()或apply()不同,transform()要求func返回一个与输入分组具有相同长度的Series或DataFrame,从而确保结果能够直接与原始DataFrame对齐,而不会改变其形状。这使得它非常适合在分组内进行计算并将结果作为新列添加回原始DataFrame。

解决方案步骤详解

我们将通过以下步骤,结合上述概念来生成所需的复合ID:

步骤1:准备示例数据

首先,我们创建一个示例DataFrame来演示操作。

import pandas as pd

data = {
    'Name': ['A', 'B', 'A', 'C', 'B', 'D', 'E', 'F'],
    'ID': [1, 2, 1, 3, 3, 3, 1, 2]
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)

输出:

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

步骤2:定义因子化函数

我们需要一个函数,它能接收一个Series(即每个分组的'Name'列),并返回其因子化后的整数编码。为了让编码从1开始而不是0,我们会在factorize的结果上加1。

Powtoon
Powtoon

AI创建令人惊叹的动画短片及简报

下载
# 定义一个lambda函数,用于对Series进行因子化并使编码从1开始
f = lambda x: pd.factorize(x)[0] + 1

步骤3:分组应用并转换

接下来,我们将DataFrame按'ID'列进行分组,然后对每个组的'Name'列应用我们定义的因子化函数f。transform()方法会确保结果正确地对齐回原始DataFrame。最后,将结果转换为字符串类型,以便后续拼接。

# 按'ID'分组,对每个组的'Name'列应用因子化函数,并将结果转换回Series
# transform确保结果的索引与原始DataFrame对齐
s = df.groupby('ID')['Name'].transform(f).astype(str)
print("\n生成的组内唯一后缀Series:")
print(s)

输出:

生成的组内唯一后缀Series:
0    1
1    1
2    1
3    1
4    2
5    3
6    2
7    2
Name: Name, dtype: object

解释:

  • 对于ID=1的分组,'Name'列是 ['A', 'A', 'E']。factorize会将其编码为 [0, 0, 1],加1后变为 [1, 1, 2]。
  • 对于ID=2的分组,'Name'列是 ['B', 'F']。factorize会将其编码为 [0, 1],加1后变为 [1, 2]。
  • 对于ID=3的分组,'Name'列是 ['C', 'B', 'D']。factorize会将其编码为 [0, 1, 2],加1后变为 [1, 2, 3]。

步骤4:拼接生成新ID

最后一步是将原始的'ID'列(转换为字符串)与步骤3中生成的后缀Series进行字符串拼接,以创建新的'ID_new'列。

# 将原始ID列转换为字符串,并与后缀Series拼接
df['ID_new'] = df['ID'].astype(str).str.cat(s, sep='_')
print("\n最终DataFrame,包含新的ID_new列:")
print(df)

输出:

最终DataFrame,包含新的ID_new列:
  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   3    3_2
5    D   3    3_3
6    E   1    1_2
7    F   2    2_2

可以看到,ID_new列已成功生成,每个原始ID组内的不同Name都获得了唯一的顺序后缀。例如,ID为1的组中,'A'对应'1_1',而'E'对应'1_2'。

完整代码示例

import pandas as pd

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

# 2. 定义因子化函数,将类别值编码为从1开始的整数
f = lambda x: pd.factorize(x)[0] + 1

# 3. 按'ID'分组,对'Name'列应用因子化函数,并将结果转换回Series
# transform确保结果的索引与原始DataFrame对齐
s = df.groupby('ID')['Name'].transform(f).astype(str)

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

print("\

相关专题

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

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

53

2025.12.04

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

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

182

2023.12.04

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

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

282

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

255

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

121

2025.08.07

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

278

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1490

2023.10.24

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

9

2026.01.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 12.9万人学习

Rust 教程
Rust 教程

共28课时 | 4.7万人学习

Git 教程
Git 教程

共21课时 | 2.9万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号