Python 在两个不同长度的数据帧中匹配最近值

Python 在两个不同长度的数据帧中匹配最近值,python,pandas,dataframe,matching,Python,Pandas,Dataframe,Matching,如果我有两个不同长度、不同标签和不同数字精度级别的数据帧,如下所示: 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位以内

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

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:

这只有在列“a”和“a”之间存在精确匹配时才起作用,但我不确定如何合并一个模糊因子以允许匹配精度在2位以内的行

尝试#2

这就产生了错误“ValueError:只能比较标签相同的系列对象”,因为我认为这两个数据帧具有不同的标签('a'、'b'和'a'、'b')

关于如何实现这一点有什么想法吗?

使用,您可以在
Mo(logn)
中找到
df1
中最接近的数学,其中
n
df2
中的元素数和
m
df1中的元素数

将熊猫作为pd导入
将numpy作为np导入
从scipy.spatial导入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 spatical_merge_NN(df1,df2,xyz=['A','B']):
''将特征从df2添加到df1,取最近点''
tree=cKDTree(df2[xyz].值)
dists,index=tree.query(df1[['a','b']].值,k=1)
fts=[df2.列中c代表c]
对于fts中的c:
df1[c]=df2[c]。值[索引]
返回df1
df_new=spatical_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
中找到最接近的一对,然后添加该行。

请尝试感谢您向我显示该链接,不幸的是,pd.merge方法似乎无法以我想要的方式为我工作。谢谢!这种方法似乎只是返回df1,而没有来自df2的匹配数据。看看这个函数,不清楚如何请求特定精度的数字来获得匹配的行。@DaxFeliz你说得对。现在修好了!谢谢!这太棒了。在“A”和“B”列中,似乎有一个重复的行。我认为可能总是这样,所以我在返回df1之前添加了一行新行,以删除最后一行:df1.drop(df1.tail(1.index,inplace=True)。虽然这在本例中有效,但您是否知道如何使用此方法更改行匹配的数字精度,以使其成为更一般的答案?是不是cKDTree函数中的“leafsize”参数?@DaxFeliz是的。它的工作方式是放置一个数据帧常量(在本例中为df1),并在
df2
中迭代,从
d2
中找到最接近的一对,然后添加该行。这意味着,您可能希望在
df2
数据中看到重复。可以考虑删除重复行。
matches_df = pd.merge(df1, df2,  how='inner', left_on=['a'], right_on = ['A'])
matches_df = df1.loc[np.round(df1['a'],2)==np.round(df2['A'],2)]