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

如何为匹配城市的两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:38:41