基于多列标识为重复个体分配唯一ID并保留所有行
为重复的pit/let/ret组合分配唯一ID
以下是几种主流工具的实现方案,均能保留所有原始行,同时为每组相同的pit/let/ret组合生成唯一标识ID:
Python(Pandas)
可以用groupby配合ngroup(),或者factorize()方法实现:
示例代码
import pandas as pd # 原始数据示例 df = pd.DataFrame({ 'pit': ['A', 'A', 'B', 'B', 'B', 'C'], 'let': ['X', 'X', 'Y', 'Y', 'Y', 'Z'], 'ret': ['1', '1', '2', '2', '2', '3'], 'other_data': [100, 200, 300, 400, 500, 600] }) # 方法1:用groupby + ngroup()(ID从0开始,可+1改为从1开始) df['unique_id'] = df.groupby(['pit', 'let', 'ret']).ngroup() + 1 # 方法2:用factorize(ID从0开始,手动+1改为从1开始) df['unique_id'] = pd.factorize(df[['pit', 'let', 'ret']].apply(tuple, axis=1))[0] + 1
输出结果
| pit | let | ret | other_data | unique_id |
|---|---|---|---|---|
| A | X | 1 | 100 | 1 |
| A | X | 1 | 200 | 1 |
| B | Y | 2 | 300 | 2 |
| B | Y | 2 | 400 | 2 |
| B | Y | 2 | 500 | 2 |
| C | Z | 3 | 600 | 3 |
SQL
利用窗口函数DENSE_RANK()(保证ID连续无间隔),按pit/let/ret分组排序生成唯一ID:
示例代码
SELECT pit, let, ret, other_data, DENSE_RANK() OVER (ORDER BY pit, let, ret) AS unique_id FROM your_table_name;
注:如果需要ID从指定值开始,可在
DENSE_RANK()结果上做加减调整,比如DENSE_RANK() OVER (...) + 99让ID从100开始。
R(dplyr)
用dplyr包的cur_group_id()或group_indices()实现:
示例代码
library(dplyr) # 原始数据示例 df <- data.frame( pit = c('A', 'A', 'B', 'B', 'B', 'C'), let = c('X', 'X', 'Y', 'Y', 'Y', 'Z'), ret = c('1', '1', '2', '2', '2', '3'), other_data = c(100, 200, 300, 400, 500, 600) ) # 方法1:cur_group_id()(ID从1开始) df <- df %>% group_by(pit, let, ret) %>% mutate(unique_id = cur_group_id()) %>% ungroup() # 方法2:group_indices() df$unique_id <- group_indices(df, pit, let, ret)
内容的提问来源于stack exchange,提问作者Amanda Goldberg
相关产品推荐
相关产品推荐

