Pandas 如何将两个具有公差值的数据帧进行内部合并?

Pandas 如何将两个具有公差值的数据帧进行内部合并?,pandas,numpy,python-3.6,Pandas,Numpy,Python 3.6,我有两个数据帧: df1<- A C 7.629 1 5.227 2 5.472 3 5.386 4 5.445 5 A B df2<- 7.634 10.0 7.732 30.0 5.223 33.0 5.479 22.0 5.390 49.0

我有两个数据帧:

 df1<-   A      C
       7.629    1
       5.227    2
       5.472    3
       5.386    4
       5.445    5

         A      B  
 df2<- 7.634   10.0
       7.732   30.0
       5.223   33.0
       5.479   22.0
       5.390   49.0
       5.439   53.0

df1
merge\u asof
似乎可以解决您的问题(推荐第二种方法,我从零开始学习~)

或使用
IntervalIndex

df2.index = pd.IntervalIndex.from_arrays(df2['A']-0.01,df2['A']+0.01,closed='both')
df1['B']=df2.loc[df1.A].B.values
df1['A']=df2.loc[df1.A].A.values
df1
Out[450]: 
                    A  C     B
[7.619, 7.639]  7.634  1  10.0
[5.217, 5.237]  5.223  2  33.0
[5.462, 5.482]  5.479  3  22.0
[5.376, 5.396]  5.390  4  49.0
[5.435, 5.455]  5.439  5  53.0

值与OP不匹配。您需要
pd.merge\u asof(df2.sort\u值(by='A')、df1.sort\u值(by='A')、direction='nearest')。sort\u值('C')。drop\u重复项(subset=['C'])
明白了,修复它间隔的简洁用法:)很好。我喜欢IntervaIndex在这里的用法+1我不断收到错误“模块'pandas'没有属性'IntervalIndex'”::如果我的解决方案在您更新pandas后有效,您可以接受:)你好,Wen,我仍然无法使其正常工作,抱歉:/。。。当使用“loc”时,我得到错误“值的长度与索引的长度不匹配”…我使用的数据集与示例中的不同(为简单起见),示例中df2有72行,因此可能有多个B列的值与df1的a列中的5个值相关联。。。另外,我的误差值更像+/-0.003,所以我不能使用第一个解(为了简单起见,我只使用了±0.01)D:现在,我使用了:v1=df1['A']].values v2=df2['A'].values dfx=df2[np.isclose(v2,v1[:,None],.003).any(0).any(1)]然后使用了您给出的第一个解决方案-这正是我想要为这个数据集做的:)!它可能不适用于我计划在将来使用的更复杂的数据集,但现在就可以了!谢谢你的帮助,我会接受你的回答!很抱歉回复太晚,我只是有时间看看你的评论,很高兴能帮上忙~
pd.merge_asof(df2.sort_values('A'), df1.sort_values('A'), direction='nearest',on='A').sort_values('C').drop_duplicates('C')
Out[415]: 
       A  C     B
0  5.227  2  33.0
1  5.386  4  49.0
2  5.445  5  53.0
3  5.472  3  22.0
4  7.629  1  10.0
df2.index = pd.IntervalIndex.from_arrays(df2['A']-0.01,df2['A']+0.01,closed='both')
df1['B']=df2.loc[df1.A].B.values
df1['A']=df2.loc[df1.A].A.values
df1
Out[450]: 
                    A  C     B
[7.619, 7.639]  7.634  1  10.0
[5.217, 5.237]  5.223  2  33.0
[5.462, 5.482]  5.479  3  22.0
[5.376, 5.396]  5.390  4  49.0
[5.435, 5.455]  5.439  5  53.0