如何使用Pandas为多列分配唯一的9位数字标识符
解决方案
规则说明
region_1_code 生成逻辑
- 将
country_code格式化为3位数字字符串(不足3位前补0,例如88→"880") - 提取所有唯一的
region_1值,按字母顺序排序后从1开始分配整数编码,将编码转换为6位格式(例如1→"100000") - 拼接3位国家编码与6位region_1编码,得到9位的
region_1_code
region_2_code 生成逻辑
- 同样将
country_code格式化为3位数字字符串 - 提取所有唯一的
region_1值,按字母顺序排序后从1开始分配整数编码,转换为3位格式(例如1→"100") - 在每个
region_1分组内,提取唯一的region_2值,按字母顺序排序后从1开始分配整数编码,转换为3位格式(例如1→"100") - 拼接3位国家编码、3位region_1编码、3位region_2编码,得到9位的
region_2_code
代码实现
import pandas as pd # 模拟输入DataFrame(对应你提供的表格内容) df = pd.DataFrame({ "country_code": [88, 88, 88, 88], "region_1": ["B", "B", "C", "C"], "region_2": ["D", "E", "D", "F"] }) # 处理country_code为3位字符串 df["country_3"] = df["country_code"].astype(str).str.zfill(3) # 生成region_1的6位编码映射,用于region_1_code sorted_r1 = sorted(df["region_1"].unique()) r1_6digit_map = {r: str((i+1)*100000) for i, r in enumerate(sorted_r1)} df["region_1_code"] = df["country_3"] + df["region_1"].map(r1_6digit_map) # 生成region_1的3位编码映射,用于region_2_code r1_3digit_map = {r: str((i+1)*100) for i, r in enumerate(sorted_r1)} df["r1_3code"] = df["region_1"].map(r1_3digit_map) # 按region_1分组,生成每组内region_2的3位编码 def assign_r2_code(group): sorted_r2 = sorted(group["region_2"].unique()) r2_3digit_map = {r: str((i+1)*100) for i, r in enumerate(sorted_r2)} group["r2_3code"] = group["region_2"].map(r2_3digit_map) return group df = df.groupby("region_1").apply(assign_r2_code).reset_index(drop=True) # 拼接生成region_2_code df["region_2_code"] = df["country_3"] + df["r1_3code"] + df["r2_3code"] # 清理辅助列 df = df.drop(["country_3", "r1_3code", "r2_3code"], axis=1) print(df)
运行结果
执行代码后得到的DataFrame与你要求的一致:
| country_code | region_1 | region_2 | region_1_code | region_2_code |
|---|---|---|---|---|
| 88 | B | D | 880100000 | 880100100 |
| 88 | B | E | 880100000 | 880100200 |
| 88 | C | D | 880200000 | 880200100 |
| 88 | C | F | 880200000 | 880200200 |
内容的提问来源于stack exchange,提问作者user308827
相关产品推荐
相关产品推荐

