2017-10-16 68 views
1

我有兩個dataframes:你如何內部合併兩個數據框與容差值?

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 

我想用±0.01的公差值執行上A列內合併,以獲得所產生的datafame:

df3<-  A  B  C 
      7.634 10.0  1 
      5.223 33.0  2 
      5.479 22.0  3 
      5.390 49.0  4 
      5.439 53.0  5 

這是可能的做?

(注意DF3的該列A已經從DF2複製值)

+0

如果我的解決方案在你更新熊貓後有效,你可以接受它:) – Wen

+0

嗨溫,我仍然無法讓它工作,對不起:/ ...當使用「loc」時,出現錯誤「值的長度與索引的長度不匹配」... – Neko

+0

我使用示例中的一組不同的數據(這是爲了簡化)其中df2有72行,所以可以有多個列B的值與df1的列A中的5個值相關聯...此外,我的錯誤值更像是+/- 0.003,因此我無法使用第一個解決方案(我再次使用了±0.01)D: – Neko

回答

3

merge_asof似乎解決你的問題(建議第2種方法,我學會了從零〜)

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 

或者使用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 
+0

值不符合OP的。你需要'pd.merge_asof(df2.sort_values(by ='A'),df1.sort_values(by ='A'),direction ='nearest')。sort_values('C')。drop_duplicates(subset = ['C '])' – Zero

+0

弄明白了,修復它 – Wen

+0

@零第二種方法向你學習〜:-) – Wen

相關問題