如何高效计算分类数据集间的距离?现有多表连接方案代码冗余
分类数据集间的距离计算优化需求
我需要计算第一个数据集到第二个数据集的分类数据距离,当前通过大量连接操作实现,代码量过大,寻求更优解决方案。
数据集信息
第一个数据集
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字段距离之和。
优化解决方案
核心思路:映射表查询 + 向量化运算
摒弃多次表连接的方式,将距离表转为字典映射,通过批量向量化操作完成计算,大幅简化代码并提升效率。
将距离表转为字典映射
把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} }加载数据集为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'])批量计算距离
遍历第一个数据集的每一行,为第二个数据集生成对应的距离列: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 )输出结果
运行后df2即为所需的最终结果,可直接打印或导出。
方案优势
- 代码简洁易维护,避免了繁琐的多表连接逻辑
- 映射查询+向量化运算的效率远高于循环连接,数据量越大优势越明显
- 字典查询的时间复杂度为O(1),计算过程高效稳定
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

