基于姓名前两位字符(不区分顺序)生成Block_ID列的技术需求
需求说明
现有包含First_Name和Last_Name字段的数据集:
First_Name Last_Name Neetu Puri Puri Neetu Sheena Arora Reena Arora Arora Sheena
需要新增Block_ID列,规则为:若两条记录的First_Name前两位字符与Last_Name前两位字符的组合(不区分前后顺序)一致,则归为同一Block。预期输出如下:
First_Name Last_Name Block_ID Neetu Puri 1 Puri Neetu 1 Sheena Arora 2 Reena Arora 3 Arora Sheena 2
方案一:Python Pandas实现
核心思路是生成统一的分组标识键,再基于键分配ID:
- 提取每个名字字段的前两位字符(若字段长度不足2,可根据实际需求补全或特殊处理)
- 对每条记录的两个前两位字符串排序后拼接,生成不区分顺序的标识键
- 将标识键转为分类类型,再生成对应的连续ID
代码示例:
import pandas as pd # 构造示例数据集(实际场景可替换为读取文件/数据库) df = pd.DataFrame({ 'First_Name': ['Neetu', 'Puri', 'Sheena', 'Reena', 'Arora'], 'Last_Name': ['Puri', 'Neetu', 'Arora', 'Arora', 'Sheena'] }) # 生成统一分组键 df['group_key'] = df.apply( lambda row: '-'.join(sorted([row['First_Name'][:2], row['Last_Name'][:2]])), axis=1 ) # 分配Block_ID(从1开始编号) df['Block_ID'] = df['group_key'].astype('category').cat.codes + 1 # 输出结果(移除临时键列) result = df[['First_Name', 'Last_Name', 'Block_ID']] print(result.to_string(index=False))
方案二:SQL实现(以MySQL为例)
利用字符串函数生成统一分组键,再通过窗口函数分配ID:
- 用
SUBSTRING提取名字前两位,LEAST和GREATEST确保两个字符串顺序统一 - 用
DENSE_RANK()窗口函数为每个唯一分组键生成连续的Block_ID
代码示例:
WITH temp_group AS ( SELECT First_Name, Last_Name, -- 生成不区分顺序的分组键 CONCAT( LEAST(SUBSTRING(First_Name, 1, 2), SUBSTRING(Last_Name, 1, 2)), '-', GREATEST(SUBSTRING(First_Name, 1, 2), SUBSTRING(Last_Name, 1, 2)) ) AS group_key FROM your_table_name -- 替换为实际表名 ) SELECT First_Name, Last_Name, DENSE_RANK() OVER(ORDER BY group_key) AS Block_ID FROM temp_group;
内容的提问来源于stack exchange,提问作者Sonakshi
相关产品推荐
相关产品推荐

