两个DataFrame无重复随机抽样:为DF1唯一ID分配随机地址
问题背景与给定数据
你需要为DF1中的每个唯一ID随机分配地址,先把两个DataFrame整理成清晰的表格:
DF1(唯一ID与对应城市)
| UNIQUE_ID | City |
|---|---|
| k5WjB6MQa5Cru | Skopje |
| k4Yq5QqXwoL4e | Skopje |
| S9jGzT5qMZLyF | Skopje |
| mhSHSuxic58Sf | Skopje |
| MU7eys8NKXQog | Skopje |
| GUBe1scNsXQog | Bitola |
| S9jGzT5qMZLyF | Kumanovo |
DF2(城市与对应地址)
| ADDRESS | City |
|---|---|
| РАТКО МИТРОВИЌ 5 БР.29-ДРАЧЕВО | Skopje |
| УЛ. МЕТОДИЈА ПАТЧЕВ БР.17А | Skopje |
| УЛ ДРАЧЕВСКА 123 | Skopje |
| УЛ.ДОМАЗЕТОВСКА БР. 24 | Skopje |
| ДРАЧЕВО УЛ. ЈАНКО МИШИЌ БР. 3 | Skopje |
| УЛ. ПАРТИЗАНСКИ ПАТ 2 БР. 1 | Skopje |
虽然你提到的分配要求不完整,但最合理的逻辑应该是按城市匹配,为同城市的ID随机分配对应城市的地址,我基于这个逻辑给你实现解决方案:
解决方案(基于Pandas)
下面是可直接运行的代码,同时会处理DF2中没有对应城市地址的情况(比如Bitola和Kumanovo):
import pandas as pd import numpy as np # 初始化两个DataFrame df1 = pd.DataFrame({ 'UNIQUE_ID': ['k5WjB6MQa5Cru', 'k4Yq5QqXwoL4e', 'S9jGzT5qMZLyF', 'mhSHSuxic58Sf', 'MU7eys8NKXQog', 'GUBe1scNsXQog', 'S9jGzT5qMZLyF'], 'City': ['Skopje', 'Skopje', 'Skopje', 'Skopje', 'Skopje', 'Bitola', 'Kumanovo'] }) df2 = pd.DataFrame({ 'ADDRESS': ['РАТКО МИТРОВИЌ 5 БР.29-ДРАЧЕВО', 'УЛ. МЕТОДИЈА ПАТЧЕВ БР.17А', 'УЛ ДРАЧЕВСКА 123', 'УЛ.ДОМАЗЕТОВСКА БР. 24', 'ДРАЧЕВО УЛ. ЈАНКО МИШИЌ БР. 3', 'УЛ. ПАРТИЗАНСКИ ПАТ 2 БР. 1'], 'City': ['Skopje']*6 }) # 按城市分组,把每个城市的地址存为字典映射 city_address_map = df2.groupby('City')['ADDRESS'].apply(list).to_dict() # 定义随机分配地址的函数 def assign_random_address(city): addresses = city_address_map.get(city, []) if addresses: return np.random.choice(addresses) # 没有对应城市的地址时返回提示文本 return f"⚠️ No address available for {city}" # 为DF1添加分配后的地址列 df1['ASSIGNED_ADDRESS'] = df1['City'].apply(assign_random_address) # 查看最终结果 print(df1)
代码说明
city_address_map:把DF2中每个城市对应的地址整理成字典,方便快速按城市查找地址列表assign_random_address:针对每个城市,随机挑选一个地址;如果没有对应城市的地址,返回友好提示- 最后通过
apply方法批量为DF1的每一行分配地址,生成新的ASSIGNED_ADDRESS列
示例输出(随机分配,每次结果略有不同)
| UNIQUE_ID | City | ASSIGNED_ADDRESS |
|---|---|---|
| k5WjB6MQa5Cru | Skopje | УЛ.ДОМАЗЕТОВСКА БР. 24 |
| k4Yq5QqXwoL4e | Skopje | ДРАЧЕВО УЛ. ЈАНКО МИШИЌ БР. 3 |
| S9jGzT5qMZLyF | Skopje | УЛ ДРАЧЕВСКА 123 |
| mhSHSuxic58Sf | Skopje | РАТКО МИТРОВИЌ 5 БР.29-ДРАЧЕВО |
| MU7eys8NKXQog | Skopje | УЛ. ПАРТИЗАНСКИ ПАТ 2 БР. 1 |
| GUBe1scNsXQog | Bitola | ⚠️ No address available for Bitola |
| S9jGzT5qMZLyF | Kumanovo | ⚠️ No address available for Kumanovo |
如果你的实际需求还有其他约束(比如地址不能重复分配、ID和地址有特定关联规则),可以补充说明,我再调整代码~
内容的提问来源于stack exchange,提问作者Prometheus
相关产品推荐
相关产品推荐

