在最接近的日期/时间戳上合并数据框。

14

我有两个如下所示的数据框:

A = pd.DataFrame({"ID":["A", "A", "C" ,"B", "B"], "date":["06/22/2014","07/02/2014","01/01/2015","01/01/1991","08/02/1999"]})

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"], "value": ["3","5","1","7","8"] })

看起来像下面这样:

>>> A
  ID       date
0  A 2014-06-22
1  A 2014-07-02
2  C 2015-01-01
3  B 1991-01-01
4  B 1999-08-02

>>> B
  ID       date value
0  A 2015-02-15     3
1  A 2014-06-30     5
2  C 1999-07-02     1
3  B 1990-10-05     7
4  B 2014-06-24     8
我希望将A和B的值合并,并使用最接近的日期。在这个例子中,没有日期匹配,但有可能会匹配。
输出应该类似于这样:
>>> C
  ID        date value
0  A  06/22/2014     8
1  A  07/02/2014     5
2  C  01/01/2015     3
3  B  01/01/1991     7
4  B  08/02/1999     1

我认为pandas应该有一个原生函数可以实现这个功能。

注意:类似的问题已经在这里提出过:pandas.merge: match the nearest time stamp >= the series of timestamps


可能是pandas merge on x,y and closest timestamp的重复问题。 - Merlin
2个回答

15

您可以使用 reindex 函数并设置 method='nearest',再使用 merge 函数:

A['date'] = pd.to_datetime(A.date)
B['date'] = pd.to_datetime(B.date)
A.sort_values('date', inplace=True)
B.sort_values('date', inplace=True)

B1 = B.set_index('date').reindex(A.set_index('date').index, method='nearest').reset_index()
print (B1)

print (pd.merge(A,B1, on='date'))
  ID_x       date ID_y value
0    B 1991-01-01    B     7
1    B 1999-08-02    C     1
2    A 2014-06-22    B     8
3    A 2014-07-02    A     5
4    C 2015-01-01    A     3

您还可以添加参数suffixes

print (pd.merge(A,B1, on='date', suffixes=('_', '')))
  ID_       date ID value
0   B 1991-01-01  B     7
1   B 1999-08-02  C     1
2   A 2014-06-22  B     8
3   A 2014-07-02  A     5
4   C 2015-01-01  A     3

谢谢Jezrael,我一直收到ValueError:索引必须单调递增或递减的错误。 - dleal
抱歉,我忘记添加排序到答案中。 - jezrael
没错,谢谢,现在它可以工作了!我正要建议将A1替换为B1。 - dleal
最后一个问题。如果我想找到每个组“ID”中最近的邻居,第一列会如何重新索引? - dleal
我不明白。你需要按 A.ID 进行分组,然后应用重新索引吗? - jezrael

5
pd.merge_asof(A, B, on="date", direction='nearest')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接