【问题标题】:Pandas merge datagrames based on most similar valuesPandas 基于最相似的值合并数据框
【发布时间】:2023-04-01 19:01:01
【问题描述】:

我正在尝试合并 2 个 pandas 数据帧,但是,合并列中的值并不完全相同。

我正在使用命令 pd.merge(D_data, L_data,on="R_Time") 但是,在 D_data 我的 R_time 列看起来像

4.316667, 4.320834, 4.325000
在我的 L_data 列中,我的数据如下所示:

4.31000, 4.32000, ...


本质上,我要做的是获取第一组中的每个项目,并将其与第二组中最接近的元素匹配。我已经使用 Excel 中的 vlookup 函数完成了此操作,但我不完全确定如何在 Pandas Dataframe 对象中获得相同的功能。

给定数据:

D_data:
4.316667
4.320834 4.325 4.329167 4.333334 4.3375 4.341667 4.345834 4.35 4.354167 4.358334

L_Data 4.316667 4.318667 4.320667 4.322667 4.324667 4.326667 4.328667 4.330667 4.332667 4.334667 4.336667

我想在这些元素之间精确配对,即使它们在大多数情况下并不完全相同。

【问题讨论】:

  • 你能给我们一些数据吗?输入和预期输出?
  • 我添加了一个例子。

标签: python pandas join merge


【解决方案1】:

你可以使用Pandas' merge_asof():

【讨论】:

    【解决方案2】:

    首先在 L_data 中使用 R_data 中最接近的值(最小绝对差的索引)创建一列,然后合并:

    import pandas as pd
    D_data =pd.DataFrame({"R_Time":[4.316667,4.320834,4.325,4.329167,4.333334,4.3375,4.341667,4.345834,4.35,4.354167,4.358334]})
    L_data =pd.DataFrame({"_R_Time":[4.316667,4.318667,4.320667,4.322667,4.324667,4.326667,4.328667,4.330667,4.332667,4.334667,4.336667]})
    
    L_data["R_Time"]=L_data.apply(lambda x:D_data["R_Time"][abs(D_data["R_Time"]-x["_R_Time"]).idxmin()],axis=1)
    pd.merge(D_data, L_data,on="R_Time")
    

    结果:

          R_Time   _R_Time
    0   4.316667  4.316667
    1   4.316667  4.318667
    2   4.320834  4.320667
    3   4.320834  4.322667
    4   4.325000  4.324667
    5   4.325000  4.326667
    6   4.329167  4.328667
    7   4.329167  4.330667
    8   4.333334  4.332667
    9   4.333334  4.334667
    10  4.337500  4.336667
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多