【问题标题】:Merge dataframes by closest coordinates按最近的坐标合并数据框
【发布时间】:2020-01-15 14:20:42
【问题描述】:

假设我们有 2 个坐标为 ['X','Y'] 的数据框:

df1:

 X            Y          House №
2531        2016           175
2219        2196           11
2901        3426           201
6901        4431           46
7891        1126           89

df2:

 X            Y      Delivery office №
2534        2019            O1
6911        4421            O2
2901        3426            O3
7894.5      1120            O4 

我的想法是合并它们并得到:

df3

 X            Y          House №    Delivery office №
2531        2016           175            01
2219        2196           11             NA
2901        3426           201            03
6901        4431           46             02
7891        1126           89             04

所以我们想通过阈值实现'模糊'合并(这个参数应该由用户给出)。您可以看到 11 号门牌没有任何送货办公室号码,因为它距离 df2 中所有显示的办公室都很远。

所以我需要 df2 中的所有行 'find' 它是最接近 df1 的行并将它的 'Cost' 值添加到它 您可以看到通常的内置 pd.merge 以及使用 levenshtein 距离等实现模糊逻辑与字符串值相关的自定义包在那里不起作用

【问题讨论】:

  • 你说衣柜价值的门槛是多少
  • @anky_91 这是一个很好的问题。我们在那里没有门槛。我们希望所有 df2 的行都找到它与 df1 最接近(就坐标距离而言)的行(我没有大喊大叫 ((: )
  • @АндрейСевостьянов 从某种意义上说,所有房屋都或多或少最接近...您需要定义阈值。或者说最接近的 3-5-10。
  • @SergeyBushmanov 你是对的!对不起。我们可以在您建议的 func 中设置此参数))但实际上,如果我们考虑到上述条件:来自 df2 的行必须在合并中完全使用
  • 那么我们就会明白我们不需要阈值

标签: python pandas fuzzy-comparison


【解决方案1】:

没有灵丹妙药,但一种方法是使用pd.cut 转换类别中的 Y 值。 使用这种方法,它会将值放在不同的 bin 中。 您需要手动调整 bin,例如将其设置为 20。

加载数据:

df1 = pd.DataFrame({'X':[2531, 2219, 2901, 6901, 7891], 'Y':[2016, 2196, 3426, 4431, 1126], 'House':['A', 'B', 'J', 'A', 'A']})

df2 = pd.DataFrame({'X':[2534, 6911, 2901, 7894.5], 'Y':[2019, 4421, 3426, 1120], 'Cost':[1200, 3100, 800, 600]})

创建新类别:

df1['Y2'] = pd.cut(df1['Y'], 20, labels=False)

df2['Y2'] = pd.cut(df2['Y'], 20, labels=False)

df3 = pd.merge(df1, df2, on=['Y2'], how='left')

【讨论】:

  • @Андрей Севостьянов:这对你有帮助吗?
  • 谢谢,有点困惑如何在真实数据中选择 bin 的数量,其中 X 为 10^6,Y 相同
  • 我们将 pd.cut 应用于不同的数据帧(具有不同的坐标范围(最小值和最大值)),因此对于相同的坐标,我们将获得不同的 bin(或范围,如果我们设置标签 = True)
  • @Андрей Севостьянов:当然,如前所述,我的答案不是灵丹妙药,特别是如果您有真实数据而不是整数并且数据变得非常大。也许您应该通过提供更多细节来改进您的问题。
猜你喜欢
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 2012-10-07
相关资源
最近更新 更多