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

如何高效计算分类数据集间的距离?现有多表连接方案代码冗余

分类数据集间的距离计算优化需求

我需要计算第一个数据集到第二个数据集的分类数据距离,当前通过大量连接操作实现,代码量过大,寻求更优解决方案。

数据集信息

第一个数据集

Id    City         Phone
A1    Jakarta      Samsung
A2    Surabaya     Apple
A3    Singapore    Sony

第二个数据集

Id    City         Phone
1     Jakarta      Samsung
2     Singapore    Xiaomi
3     Surabaya     Sony

距离参考表

City字段距离表

Jakarta  Surabaya    Singapore
Jakarta            0         1           2
Surabaya           1         0           1
Singapore          2         1           0

Phone字段距离表

Apple   Samsung        Sony      Xiaomi
Apple              0         1           2           3
Samsung            1         0           1           2
Sony               2         1           0           1
Xiaomi             3         2           1           0

计算逻辑示例

计算过程

Id    City         Phone          A1        A2        A3
1     Jakarta      Samsung       0+0       1+1       2+1
2     Singapore    Xiaomi        1+2       2+3       0+1
3     Surabaya     Sony          1+1       0+2       2+0

最终输出结果

Id    City         Phone          A1        A2        A3
1     Jakarta      Samsung         0         2         3
2     Singapore    Xiaomi          3         5         1
3     Surabaya     Sony            2         2         2

注:A1、A2、A3对应第一个数据集中的行,最终结果为每行City字段距离与Phone字段距离之和。

优化解决方案

核心思路:映射表查询 + 向量化运算

摒弃多次表连接的方式,将距离表转为字典映射,通过批量向量化操作完成计算,大幅简化代码并提升效率。

  1. 将距离表转为字典映射
    把City和Phone的距离表转成嵌套字典,实现O(1)时间复杂度的快速查询:

    # City距离映射
    city_dist = {
        'Jakarta': {'Jakarta':0, 'Surabaya':1, 'Singapore':2},
        'Surabaya': {'Jakarta':1, 'Surabaya':0, 'Singapore':1},
        'Singapore': {'Jakarta':2, 'Surabaya':1, 'Singapore':0}
    }
    
    # Phone距离映射
    phone_dist = {
        'Apple': {'Apple':0, 'Samsung':1, 'Sony':2, 'Xiaomi':3},
        'Samsung': {'Apple':1, 'Samsung':0, 'Sony':1, 'Xiaomi':2},
        'Sony': {'Apple':2, 'Samsung':1, 'Sony':0, 'Xiaomi':1},
        'Xiaomi': {'Apple':3, 'Samsung':2, 'Sony':1, 'Xiaomi':0}
    }
    
  2. 加载数据集为DataFrame
    使用Pandas加载两个数据集,便于后续批量处理:

    import pandas as pd
    
    df1 = pd.DataFrame([
        ['A1', 'Jakarta', 'Samsung'],
        ['A2', 'Surabaya', 'Apple'],
        ['A3', 'Singapore', 'Sony']
    ], columns=['Id', 'City', 'Phone'])
    
    df2 = pd.DataFrame([
        ['1', 'Jakarta', 'Samsung'],
        ['2', 'Singapore', 'Xiaomi'],
        ['3', 'Surabaya', 'Sony']
    ], columns=['Id', 'City', 'Phone'])
    
  3. 批量计算距离
    遍历第一个数据集的每一行,为第二个数据集生成对应的距离列:

    for _, row in df1.iterrows():
        target_id = row['Id']
        # 计算当前行与df2每行的City距离+Phone距离之和
        df2[target_id] = df2.apply(
            lambda x: city_dist[x['City']][row['City']] + phone_dist[x['Phone']][row['Phone']],
            axis=1
        )
    
  4. 输出结果
    运行后df2即为所需的最终结果,可直接打印或导出。

方案优势

  • 代码简洁易维护,避免了繁琐的多表连接逻辑
  • 映射查询+向量化运算的效率远高于循环连接,数据量越大优势越明显
  • 字典查询的时间复杂度为O(1),计算过程高效稳定

内容的提问来源于stack exchange,提问作者Nabih Bawazir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:15:48