如何为匹配城市的两个DataFrame分配随机唯一地址?
嘿,这个需求我之前也碰到过,常规的Join生成的笛卡尔积完全满足不了「随机且唯一分配地址」的要求,得换分组+映射的思路来实现。下面是具体的解决方案:
按城市匹配,为DataFrame2分配随机唯一地址
核心思路
先把DataFrame1里每个城市对应的地址收集起来并随机打乱,然后给DataFrame2中同一城市的每一行依次分配地址,同时确保用过的地址不会重复分配。
步骤1:预处理DataFrame1,构建随机化的城市-地址映射
首先我们要把每个城市的地址整理成随机顺序的列表,这样后续分配出来的地址才是随机的:
import pandas as pd import numpy as np # 先搞点示例数据方便测试 df1 = pd.DataFrame({ 'City': ['New York', 'New York', 'London', 'London', 'London', 'Paris'], 'Address': ['123 Main St', '456 Oak Ave', '789 King Rd', '101 Queen St', '202 Bridge Ln', '303 Rue de Rivoli'] }) df2 = pd.DataFrame({ 'City': ['New York', 'New York', 'London', 'Paris', 'London'], 'OtherField': ['A', 'B', 'C', 'D', 'E'] }) # 按城市分组,把每个城市的地址打乱后存成字典 city_address_map = df1.groupby('City')['Address'].apply( lambda x: np.random.permutation(x.values).tolist() ).to_dict()
步骤2:为DataFrame2的每行分配唯一地址
接下来我们对DataFrame2按城市分组,给每个组的行依次分配对应城市的地址,并且用过的地址会从映射中移除,保证唯一性:
def assign_unique_address(group): current_city = group['City'].iloc[0] # 取出当前城市的随机地址列表 available_addresses = city_address_map[current_city] # 给当前组的每一行分配地址(取对应数量的地址) group['AssignedAddress'] = available_addresses[:len(group)] # 更新地址列表,去掉已经用过的地址,避免重复分配 city_address_map[current_city] = available_addresses[len(group):] return group # 按城市分组应用分配函数 df2_with_address = df2.groupby('City', group_keys=False).apply(assign_unique_address)
关键细节说明
- 随机性保证:用
np.random.permutation打乱每个城市的地址列表,每次运行分配的地址顺序都不一样。 - 唯一性保证:每次分配后都会把用过的地址从映射列表中移除,同一个地址不会被分给同一城市的多个行。
- 规模适配:只要DataFrame1中每个城市的地址数量 ≥ DataFrame2中该城市的行数,这个方法就能完美运行;如果地址不够用,你可以选择去掉更新地址列表的步骤来重复使用地址,或者加个判断抛出提示。
拿示例数据测试的话,输出结果大概是这样的(因为随机,每次结果会有差异):
City OtherField AssignedAddress 0 New York A 456 Oak Ave 1 New York B 123 Main St 2 London C 202 Bridge Ln 3 Paris D 303 Rue de Rivoli 4 London E 789 King Rd
这样就搞定了你的需求啦!
内容的提问来源于stack exchange,提问作者Prometheus
相关产品推荐
相关产品推荐

