【问题标题】:Python Pandas: Find closest match for multiple columns between two dataframesPython Pandas:查找两个数据帧之间多列的最接近匹配
【发布时间】:2021-07-05 15:12:25
【问题描述】:

我有两个数据框,它们都包含 3 个值 df1(X,Y,Z), df2(A,B,C) 我希望创建一个新的数据框 df3,其中包含提取所有最接近的匹配df1 中每一行的 df2 中的组件;即对于 df1 中的每一行,返回 df2 中 A 到 X、B 到 Y、C 到 Z 最接近匹配的行。

类似于How do I find the closest values in a Pandas series to an input number?,但是这个问题只寻求基于单个值返回最近的行,而我试图返回所有三个列最近匹配的行返回并针对 df1 中的 每一行 迭代该过程,而不是单个值。

输入
df1

 Index A    B    C
 1     2    4    6 
 2     0.8  7    9
  

df2

Index X     Y     Z
1     11    3     4.5
2     2.2   4.4   5.8
3     1     6.8   9.3
4     1.3   10    9.5

输出

df3

 Index X     Y     Z
 2     0.32  0.11  0.4
 3     1     6.8   9.3

【问题讨论】:

  • 解决方案的效率应该如何/我们在谈论多少数据?一种方法可能是创建另一个具有差异的列并选择与此新列相关的 argmin。这对你有用吗?
  • @André 那是我应该提到的好点,我的示例中的一些 df2 数据帧将高达 300 万行。我相信您的建议与下面 Michael O 的回答类似 - 我不确定这会有多有效,但会试一试。谢谢。
  • 我已经编辑了我的答案以获得想要的结果。

标签: python pandas dataframe


【解决方案1】:

找出他们差异产品的最小值:

df3 = pd.DataFrame()
for k, v in df1.iterrows(): 
    i = ((df2['X']-v['A']) * \
       (df2['Y']-v['B']) * \
       (df2['Z']-v['C'])).abs().idxmin() 
    df3 = df3.append(df2.loc[i])

print(df3)


     X    Y    Z
2  2.2  4.4  5.8
3  1.0  6.8  9.3

【讨论】:

  • 请注意,排序需要O(nlogn) 计算步骤,而最小值可以在O(n) 中找到。使用 idxmin 而不是 sort_values().index[0] 将提高更大数据集的性能。
  • @André 谢谢你的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-16
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 2018-05-08
  • 2015-08-10
相关资源
最近更新 更多