【问题标题】:Matching nearest values in two dataframes of different lengths匹配两个不同长度的数据帧中的最近值
【发布时间】:2021-04-14 20:55:48
【问题描述】:

如果我有两个不同长度、不同标签和不同数字精度级别的数据框,如下所示:

df1 = pd.DataFrame({'a':np.array([1.2345,2.2345,3.2345]),'b':np.array([4.123,5.123,6.123])})
df2 = pd.DataFrame({'A':np.array([1.2346,2.2343]),'B':np.array([4.1232,5.1239])})

如何找到两个数据帧在“a”和“A”列之间具有近似匹配值的行(例如在 2 位精度内),从而产生这样的数据帧

      a         b         A         B
------------------------------------------------
 | 1.2345  |  4.123  |  1.2346  |  4.1232  |
 | 2.2345  |  5.123  |  2.2343  |  5.1239  |

尝试:

尝试 #1:

matches_df = pd.merge(df1, df2,  how='inner', left_on=['a'], right_on = ['A'])

这仅在“a”和“A”列之间存在完全匹配时才有效,但我不确定如何合并一个 fudge 因子以允许匹配精度在 2 位以内的行。

尝试 #2

matches_df = df1.loc[np.round(df1['a'],2)==np.round(df2['A'],2)]

这给出了错误“ValueError: Can only compare same-labeled Series objects”,因为 我认为这两个数据框有不同的标签('a'、'b' 和 'A'、'B ')。

关于如何实现这一点的任何想法?

【问题讨论】:

标签: python pandas dataframe matching


【解决方案1】:

使用KDTree,您可以在m O(log n) 中找到最接近df1 的数学运算,其中ndf2m 中元素的数量df1

import pandas as pd
import numpy as np
from scipy.spatial import cKDTree

df1 = pd.DataFrame({'a':np.array([1.2345,2.2345,3.2345]),'b':np.array([4.123,5.123,6.123])})
df2 = pd.DataFrame({'A':np.array([1.2346,2.2343]),'B':np.array([4.1232,5.1239])})


def spatial_merge_NN(df1, df2, xyz=['A', 'B']):
    ''' Add features from df2 to df1, taking closest point '''
    tree = cKDTree(df2[xyz].values)
    dists, indices = tree.query(df1[['a','b']].values, k=1)
    fts = [c for c in df2.columns]
    for c in fts:
        df1[c] = df2[c].values[indices]
    return df1

df_new = spatial_merge_NN(df1, df2, ['A', 'B'])
#         a      b       A       B
# 0  1.2345  4.123  1.2346  4.1232
# 1  2.2345  5.123  2.2343  5.1239
# 2  3.2345  6.123  2.2343  5.1239

它放置一个数据帧常量(在本例中为 df1)并遍历 df2 并从 d2 中找到最接近的一对并添加该行。

【讨论】:

  • 谢谢!这种方法似乎只返回 df1 而没有来自 df2 的匹配数据。查看函数,不清楚如何请求特定精度的数字来获取匹配的行。
  • 非常感谢!这很棒。在“A”、“B”列中,似乎有重复的行。我认为这可能总是如此,所以我在返回 df1 之前添加了一个新行以删除最后一行:df1.drop(df1.tail(1).index,inplace=True)。虽然这在这种情况下有效,但您是否知道如何更改使用此方法匹配行的数字精度,以使其成为更通用的答案?会是 cKDTree 函数中的“leafsize”参数吗?
  • @DaxFeliz 是的。它的工作方式是放置一个数据帧常量(在本例中为 df1)并遍历df2 并从d2 中找到最接近的对并添加该行。这意味着,您可能希望在df2 数据中看到重复项。您可以考虑删除重复行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多