You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于多列标识为重复个体分配唯一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

输出结果

pitletretother_dataunique_id
AX11001
AX12001
BY23002
BY24002
BY25002
CZ36003

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:20:29