[英]Merge Pandas DataFrame using apply() to only merge on partial match in two columns
我需要合並兩個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
現在,如果我只是將它們連接到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
現在,為簡單起見,我還想基於來自左側DataFrame的整數值的+1或-1的整數合並列值。 在我們的示例中,除了具有值3
和4
的行之外,左側的DataFrame中的值66
還應與右側的DataFrame中的值67
匹配:
col1 col2 col1a col2b
0 a 3 aa 3
1 b 4 bb 4
2 c 66 cc 67
不確定如何解決此問題,是否需要使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.