【问题标题】:Nearest match merge on two columns (pandas)两列上的最近匹配合并(熊猫)
【发布时间】:2016-08-29 00:58:04
【问题描述】:

与我之前的一个问题 (Merge dataframes on nearest datetime / timestamp) 类似,我想使用最接近的匹配来合并两个日期时间列上的两个 pandas 数据框:

令 A 和 B 是两个数据帧,如下所示:

A = pd.DataFrame({"ID":["A", "A", "C" ,"B", "B"], "init_date":["01/01/2015","07/02/2014","08/02/1999","01/01/1991","06/22/2014"], "fin_date":["04/16/1923","09/24/1945","06/24/1952","11/26/1988","10/05/1990"]})

 In [15]: A
Out[15]: 
  ID    fin_date   init_date
0  A  04/16/1923  01/01/2015
1  A  09/24/1945  07/02/2014
2  C  06/24/1952  08/02/1999
3  B  11/26/1988  01/01/1991
4  B  10/05/1990  06/22/2014


B = pd.DataFrame({"ID":["A", "A", "C" ,"B", "B"], "date":["02/15/2015","06/30/2014","07/02/1999","10/05/1990","06/24/2014"],"fin_date":["12/10/1926","01/01/1944","08/21/1955","12/12/1987","11/05/1991"], "value": ["3","5","1","7","8"] })

 In [11]: B
Out[11]: 
  ID        date    fin_date value
0  A  02/15/2015  12/10/1926     3
1  A  06/30/2014  01/01/1944     5
2  C  07/02/1999  08/21/1955     1
3  B  10/05/1990  12/12/1987     7
4  B  06/24/2014  11/05/1991     8

生成的数据框应如下所示:

In [21]: C
Out[21]: 
  ID    fin_date   init_date value
0  A  04/16/1923  01/01/2015     3
1  A  09/24/1945  07/02/2014     5
2  C  06/24/1952  08/02/1999     1
3  B  11/26/1988  01/01/1991     7
4  B  10/05/1990  06/22/2014     8

一般问题可能与 init_date 和 fin_date 都不匹配,但是,例如,当 init_date 完全匹配时,我也会对解决方案感兴趣。

请注意,一个困难是一场比赛可能比最终日期更接近 init_date 中的值,而竞争比赛可能相反。在这种情况下,我更喜欢更接近 init_date 的那个。据我所知,在尝试了与链接中的方法类似的方法后,我发现“最近”的重新索引并未针对多索引实现。

谢谢你,感谢你的帮助,

【问题讨论】:

标签: python pandas


【解决方案1】:
pd.merge(A,B['value'],on=['ID','fin_date'],how='left')

【讨论】:

  • @languitar 我的代码出了什么问题?我错过了什么吗?
  • 我只是把它做成了一个代码块,没有别的。但它至少错过了列名成为字符串的引号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2015-11-30
  • 2019-07-13
  • 2016-12-12
  • 2014-10-20
相关资源
最近更新 更多