如何将DataFrame的ID值重编码为从1开始的连续正整数?
Pandas实现ID值从小到大连续重新编码
你需要将DataFrame中的ID按从小到大的顺序重新编码为从1开始的连续整数,最小的ID对应1,次小对应2,以此类推。以下是两种实用的实现方法:
方法一:手动构建映射字典(直观可控)
这种方式可以清晰看到每个原始ID对应的新编码,适合需要自定义映射规则的场景:
import pandas as pd # 构造原始DataFrame(如果已有则跳过此步) data = { 'ID': [202, 202, 1756, 1756, 1756, 2153, 2153, 3276, 5609, 5609, 5609], 'stop': [9, 2, 5, 3, 4, 14, 3, 1, 9, 2, 5], 'x': [20, 23, 5, 7, 3, 121, 122.5, 54, -2, 8, 102], 'y': [27, 24, 41, 42, 50, 12, 2, 33, 44, 44, -23], 'z': [4, 13, 73, 72, 73, 6, 6, -12, -32, -32, 16] } df = pd.DataFrame(data) # 1. 提取并排序所有唯一ID sorted_ids = sorted(df['ID'].unique()) # 2. 建立原始ID到新编码的映射(编码从1开始) id_map = {old_id: new_id for new_id, old_id in enumerate(sorted_ids, start=1)} # 3. 替换原ID列 df['ID'] = df['ID'].map(id_map) print(df)
方法二:使用rank函数(简洁高效)
利用Pandas内置的rank函数,一行代码即可完成编码,适合快速实现需求:
# 直接对ID列进行连续排名编码 df['ID'] = df['ID'].rank(method='dense', ascending=True).astype(int)
method='dense':确保编码是连续整数(不会出现跳过的情况)ascending=True:按原始ID从小到大排序编码astype(int):将排名结果转为整数类型
运行后即可得到你需要的目标DataFrame。
内容的提问来源于stack exchange,提问作者Aleksander
相关产品推荐
相关产品推荐

