Сопоставление двух таблиц с использованием панд

#pandas

Вопрос:

У меня есть эти две таблицы, одна таблица называется LineMax

 OrigNode DestNode DivisionNum Prefix FromMP ToMP Suffix  7764 25961 3 AB 18 20.9  7764 50213 3 AB 18 17.3  7765 35444 3 AB 0 1.5  7841 35444 3 AB 6 1.5  15390 25961 3 AB 23.75 20.9  25961 7764 3 AB 20.9 18  25961 15390 3 AB 20.9 23.75   

И у меня есть еще один набор данных

 OPER_MNT_DIV_CD TRK_CLS_NBR LN_PFX SEG_BGN_MP SEG_END_MP LN_SFX  4 1 362.7 362.71   4 1 362.71 362.83   4 1 362.83 362.98   4 1 362.98 363.35   4 1 363.35 363.4   4 1 363.4 363.54   4 1 363.54 363.67   4 1 363.67 363.81   4 1 363.81 363.95   4 1 363.95 364.1   4 1 364.1 364.15   4 1 364.15 364.5   4 1 364.5 364.55   

Я пытаюсь сопоставить свои данные. В принципе,я хочу сопоставить свою вторую таблицу с тем же префиксом, суффиксом и номером деления.

Так что в основном

Префикс=LN_pfx

Суффикс=LN_SFX

НОМЕР ПОДРАЗДЕЛЕНИЯ=OPER_MNT_DIV_CD

Я также хочу, чтобы мой первый в Mp и из Mp содержался в MP SEG BGN И в КОНЕЧНОМ MP SEG, как этот $Seg_BGN_MPlt;=fromMplt;ToMp

Но я, похоже, не могу заставить свой код работать. В моей второй таблице данных было немного пробелов, поэтому я удалил их и превратил код операции MNT DIV из строки в int, чтобы упростить сравнение.

Я также удалил все пробелы и превратил каждую строку в заглавную в моей первой таблице. Но я, кажется, не могу найти нужные мне спички.

 import numpy as np import pyodbc import math x=pyodbc.connect("DSN=DBP1") table1=pd.read_csv("LineMaxOrder.csv") s2="select oper_mnt_div_cd, trk_cls_nbr, ln_pfx, seg_bgn_mp, seg_end_mp, ln_sfx, crvtr_mn, crvtr_deg, xstg_elev from dcmctrk.crv_seg where trk_cls_nbr = 1 order by oper_mnt_div_cd, ln_pfx,ln_sfx" table1=table1.drop(table1.columns[[0]],axis=1) dChange=pd.read_sql_query(s2,x) dChange["LN_PX"]=dChange["LN_PFX"].str.strip() dChange["LN_PFX"]=dChange["LN_PFX"].str.upper() dChange["LN_SFX"]=dChange["LN_SFX"].str.strip() dChange["LN_SFX"]=dChange["LN_SFX"].str.upper() dChange["OPER_MNT_DIV_CD"]=dChange["OPER_MNT_DIV_CD"].astype(int) dfObj2=table1.select_dtypes(["object"]) table1[dfObj2.columns] = dfObj2.apply(lambda x: x.str.strip()) table1[dfObj2.columns]=dfObj2.apply(lambda x:x.str.upper()) table1=table1.fillna('') w=[] for idx,row in table1.iterrows():  a=row[3]  b=row[4]  c=row[7]  agu1=row[5]  agu2=row[6]  big=max(agu1,agu2)  small=min(agu2,agu1)  result=dChange[(dChange["OPER_MNT_DIV_CD"]==a)amp;(dChange["LN_PFX"]==b)amp;(dChange["LN_SFX"]==c)]  if result.empty:  continue  else:  result[(result["SEG_BGN_MP"]lt;=small)amp;(result["SEG_END_MP"]gt;=big)]  if result.empty:  continue  else:  print(result)  w.append(result)     

Ответ №1:

используйте слияние панд для объединения соединений как : внутреннее, левое или правое и связывания с помощью соответствующих полей