首页 > 解决方案 > 如何使用 merge_as 在两列上合并两个数据框?

问题描述

我有两个数据框,有两个索引,name, time

我想要的是将它们合并到nameand上time

例如:

In [30]: import numpy as np

In [31]: a = pd.DataFrame(np.reshape(range(25), (5,5)))

In [32]: b = pd.DataFrame(np.reshape(range(25), (5,5)))

In [33]: a['name'] = ['a', 'b', 'c', 'c','d']

In [34]: b['name'] = ['a', 'b', 'b', 'c','d']

In [35]: a
Out[35]: 
    0   1   2   3   4 name
0   0   1   2   3   4    a
1   5   6   7   8   9    b
2  10  11  12  13  14    c
3  15  16  17  18  19    c
4  20  21  22  23  24    d

In [36]: b
Out[36]: 
    0   1   2   3   4 name
0   0   1   2   3   4    a
1   5   6   7   8   9    b
2  10  11  12  13  14    b
3  15  16  17  18  19    c
4  20  21  22  23  24    d

In [38]: pd.merge_asof(a, b, on=['name', 4], tolerance=pd.Timedelta('200ms'), direction='nearest', suffixes=['', '_x'])  # here failed

因为name,我需要完全匹配。因为time,我可以有一个edurance。

我知道merge_as可以按时间间隔合并数据帧。

但我发现它不能在两列中使用。

你能帮忙吗?如何将它们与完全匹配name和间隔匹配合并time

标签: pythonpandas

解决方案


您可以通过 by 进行精确匹配,还需要转换为 datetime

a['key'] = pd.to_datetime(a[4])
b['key'] = pd.to_datetime(b[4])
out = pd.merge_asof(a, b, by = ['name'],on=['key'], tolerance=pd.Timedelta('200ms'), direction='nearest', suffixes=['', '_x'])
Out[59]: 
    0   1   2   3   4  ... 0_x 1_x  2_x  3_x  4_x
0   0   1   2   3   4  ...   0   1    2    3    4
1   5   6   7   8   9  ...   5   6    7    8    9
2  10  11  12  13  14  ...  15  16   17   18   19
3  15  16  17  18  19  ...  15  16   17   18   19
4  20  21  22  23  24  ...  20  21   22   23   24

推荐阅读