我需要合并两个pandas DataFrame,但不仅要合并确切的列值,还要合并近似的值。
例如,我有以下两个DataFrame:
import pandas as pd
d = {'col1': ["a", "b", "c", "d"], 'col2': [3, 4, 66, 120]}
df = pd.DataFrame(data=d)
col1 col2
0 a 3
1 b 4
2 c 66
3 d 120
d2 = {'col1a': ["aa", "bb", "cc", "dd"], 'col2b': [3, 4, 67, 100]}
df2 = pd.DataFrame(data=d2)
col1a col2b
0 aa 3
1 bb 4
2 cc 67
3 dd 100
Run Code Online (Sandbox Code Playgroud)
现在,如果仅将它们连接到col2和col2b列上,则我将仅获得两行,其中列的值完全相同。
pd.merge(df, df2, how='inner', left_on='col2', right_on='col2b')
col1 col2 col1a col2b
0 a 3 aa 3
1 b 4 bb 4
Run Code Online (Sandbox Code Playgroud)
现在,为简单起见,我还想基于来自左侧DataFrame的整数值的+1或-1的整数合并列值。在我们的示例中,左侧的DataFrame中的值除应与具有和的行外,还应与右侧的DataFrame中的值66匹配:6734
col1 col2 col1a col2b
0 a 3 aa 3
1 b 4 bb 4
2 c 66 cc 67
Run Code Online (Sandbox Code Playgroud)
不确定如何解决此问题,需要以某种方式基于近似列值进行合并apply()?
这是从 merge_asof
pd.merge_asof(df,df2,left_on='col2',right_on='col2b',tolerance = 1,direction ='nearest').dropna()
Out[7]:
col1 col2 col1a col2b
0 a 3 aa 3.0
1 b 4 bb 4.0
2 c 66 cc 67.0
Run Code Online (Sandbox Code Playgroud)