
本教程详细介绍了如何在pandas dataframe中为每个分组生成一个独立的、递增的序列id。通过结合使用`groupby()`和`cumcount()`方法,您可以轻松实现基于特定列值重置计数的功能,从而创建出结构化的、易于管理的分组标识符。
在数据处理和分析中,我们经常需要为数据记录生成唯一的标识符。有时,这些标识符需要在一个特定的类别或组内重新开始计数。例如,在一个包含多个城市的数据集中,我们可能希望为每个城市的记录分配一个从1开始的序列号,而不是整个数据集的全局序列号。这种需求被称为生成“分组序列ID”。
考虑以下场景:我们有一个包含城市(City)和姓名(Name)的DataFrame,目标是生成一个格式为“城市缩写-姓名缩写-序列号”的ID。关键在于,当城市名称变化时,序列号应该从1重新开始计数。
原始数据示例:
| City | Name |
|---|---|
| Paris | John |
| Paris | Paul |
| Paris | Pierre |
| Paris | Paula |
| Rome | Riccardo |
| Rome | Jean-Paul |
| Rome | Franc |
期望的输出ID示例:
| City | Name | Id |
|---|---|---|
| Paris | John | Par-Joh-1 |
| Paris | Paul | Par-Pau-2 |
| Paris | Pierre | Par-Pie-3 |
| Paris | Paula | Par-Pau-4 |
| Rome | Riccardo | Rom-Ric-1 |
| Rome | Jean-Paul | Rom-Jea-2 |
| Rome | Franc | Rom-Fra-3 |
一种直观但错误的方法是直接使用DataFrame的全局索引作为序列号的一部分。例如,尝试通过以下方式构建ID:
import pandas as pd
data = {
'City': ['Paris', 'Paris', 'Paris', 'Paris', 'Rome', 'Rome', 'Rome'],
'Name': ['John', 'Paul', 'Pierre', 'Paula', 'Riccardo', 'Jean-Paul', 'Franc']
}
df = pd.DataFrame(data)
# 错误尝试:使用全局索引
df['Id_Incorrect'] = df.City.str[:3] + '-' + df.Name.str[:3] +'-' + df.index.astype(str)
print("错误尝试的输出:")
print(df)错误尝试的输出:
City Name Id_Incorrect 0 Paris John Par-Joh-0 1 Paris Paul Par-Pau-1 2 Paris Pierre Par-Pie-2 3 Paris Paula Par-Pau-3 4 Rome Riccardo Rom-Ric-4 5 Rome Jean-Paul Rom-Jea-5 6 Rome Franc Rom-Fra-6
如上所示,Id_Incorrect列中的序列号(0到6)是基于DataFrame的全局索引生成的,它不会在City列的值发生变化时重置。这不符合我们为每个城市独立计数的预期。
Pandas提供了groupby()方法来对数据进行分组操作,结合cumcount()方法可以在每个分组内部生成一个累积计数。这正是解决分组序列ID问题的关键。
下面是实现分组序列ID的正确代码:
import pandas as pd
# 示例数据
data = {
'City': ['Paris', 'Paris', 'Paris', 'Paris', 'Rome', 'Rome', 'Rome'],
'Name': ['John', 'Paul', 'Pierre', 'Paula', 'Riccardo', 'Jean-Paul', 'Franc']
}
df = pd.DataFrame(data)
# 正确的方法:使用 groupby().cumcount()
df['Id'] = (df.City.str[:3] + '-' + df.Name.str[:3] +'-' +
df.groupby('City').cumcount().add(1).astype(str))
print("正确方法的输出:")
print(df)City Name Id 0 Paris John Par-Joh-1 1 Paris Paul Par-Pau-2 2 Paris Pierre Par-Pie-3 3 Paris Paula Par-Pau-4 4 Rome Riccardo Rom-Ric-1 5 Rome Jean-Paul Rom-Jea-2 6 Rome Franc Rom-Fra-3
从输出可以看出,当City从'Paris'变为'Rome'时,Id中的序列号成功地从1重新开始计数,完全符合我们的预期。
利用Pandas的groupby().cumcount()方法是生成分组序列ID的强大而简洁的解决方案。它避免了手动循环或复杂逻辑的需要,提供了一种高效、可读性强的方式来处理这类常见的数据处理任务。掌握这一技巧将极大地提升您在数据分析和报告中的效率。
以上就是Pandas教程:高效生成分组序列ID的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号