2017-11-01 4 views
1

Ich habe zwei Datenrahmen. Ich werde meine Anforderung in Form einer Schleife erklären - denn so visualisiere ich das Problem. Mir ist klar, dass es eine andere Lösung geben kann. Wenn das also anders geht, kannst du es teilen! Ich bin neu bei Pandas, also kämpfe ich mit dieser Lösung. Vielen Dank im Voraus für das Betrachten meiner Frage !!Pandas Vergleicht zwei Datenrahmen

Ich habe 2 Datenrahmen, die 3 Spalten haben: ID, ODO, ODOLength. ODOLength ist die Lauf Differenz für jeden Datensatz ODO, die ich habe mit: abs(Df1['Odo'] - Df1['Odo'].shift(-1))

OldDataSet = {'id' : [10,20,30,40,50,60,70,80,90,100,110,120,130,140],'Odo': [-1.09,1.02,26.12,43.12,46.81,56.23,111.07,166.38,191.27,196.41,207.74,231.61,235.84,240.04], 'OdoLength':[2.11,25.1,17,3.69,9.42,54.84,55.31,24.89,5.14,11.33,23.87,4.23,4.2,4.09]} 

NewDataSet = {'id' : [1000,2000,3000,4000,5000,6000,7000,8000,9000,10000,11000,12000,13000,14000],'Odo': [1.51,2.68,4.72,25.03,42,45.74,55.15,110.05,165.41,170.48,172.39,190.35,195.44,206.78], 'OdoLength':[1.17,2.04,20.31,16.97,3.74,9.41,54.9,55.36,5.07,1.91,17.96,5.09,11.34,23.89]} 

FinalResultDataSet = {'DFOneId':[10,20,30,40,50,60,70,80,90,100,110], 'DFTwoID' : [1000,3000,4000,5000,6000,7000,8000,11000,12000,13000,14000], 'OdoDiff': [2.6,3.7,1.09,1.12,1.07,1.08,1.02,6.01,0.92,0.97,0.96], 'OdoLengthDiff':[0.94,4.79,0.03,0.05,0.01,0.06,0.05,6.93,0.05,0.01,0.02], 'OdoAndLengthDiff':[1.66,1.09,1.06,1.07,1.06,1.02,0.97,0.92,0.87,0.96,0.94]} 


df1= pd.DataFrame(OldDataSet) 

df2 = pd.DataFrame(NewDataSet) 

FinalDf = pd.DataFrame(FinalResultDataSet) 

Die Logik dahinter, wie der FinalDF zu bekommen, ist wie folgt: Nehmen Sie Odo und Odolen von DF1 und subtrahieren sie von jedem Odo und Odolen Spalten in df2. Nimm den niedrigsten Wert der Differenz und vergleiche sie. Beginnen Sie für den nächsten Vergleich von Df1 und Df2 mit dem ersten Df2-Datensatz, der keine Übereinstimmung aufweist. Wenn Df2-Werte kein Mindestwert sind, wird für die aktuellen Df1-Werte , der verglichen wird, dieser Datensatz von DF2 nicht in den endgültigen Datensatz aufgenommen. Zum Beispiel wurde Df1 ID 20- mit Df2 ID 2000 verglichen und das Endergebnis war jedoch 21,4 ((DfOne · ODO: 1,02-DfTwo · ODO: 2,68) - (DfOneODOLen: 25,1-DfTwo · ODoLen-2,04) = 21,4) wenn Df1 ID 20 mit Df2 3000 verglichen wird, beträgt der endgültige Unterschied 1,09 ((DfOne.ODO: 1,02-DfTwo.ODO: 4,72) - (DfOneODOLen: 25,1-DfTwo.ODoLen-20,31) = 1,06). In diesem Fall wird Df2 ID 3000 mit DF1 ID 20 und Df2 ID - 2000 abgeglichen, da die Differenz größer ist. Zu diesem Zeitpunkt wird DF2 ID 2000 für keine anderen Übereinstimmungen berücksichtigt. Daher würde der nächste DF1-Datensatzvergleich bei DF2 ID 4000 beginnen, da dies der nächste Wert ist, der keine Übereinstimmung aufweist.

Wie gesagt, ich bin offen für alle Vorschläge!

Danke!

Antwort

1

Sie können merge_asof

Schritt 1: kombinieren, um den Datenrahmen

df1['match']=df1.Odo+df1.OdoLength 
df2['match']=df2.Odo+df2.OdoLength 

out=pd.merge_asof(df1,df2,on='match',direction='nearest') 
out.drop_duplicates(['id_y']) 
Out[728]: 
    Odo_x OdoLength_x id_x match Odo_y OdoLength_y id_y 
0 -1.09   2.11 10 1.02 1.51   1.17 1000 
1  1.02  25.10 20 26.12 4.72  20.31 3000 
2 26.12  17.00 30 43.12 25.03  16.97 4000 
3 43.12   3.69 40 46.81 42.00   3.74 5000 
4 46.81   9.42 50 56.23 45.74   9.41 6000 
5 56.23  54.84 60 111.07 55.15  54.90 7000 
6 111.07  55.31 70 166.38 110.05  55.36 8000 
7 166.38  24.89 80 191.27 172.39  17.96 11000 
8 191.27   5.14 90 196.41 190.35   5.09 12000 
9 196.41  11.33 100 207.74 195.44  11.34 13000 
10 207.74  23.87 110 231.61 206.78  23.89 14000 

Schritt 2

Dann sind Sie so etwas wie unten tun können, um neue Spalte

out['OdoAndLengthDiff']=out.OdoLength_x-out.OdoLength_y+out.Odo_x-out.Odo_y 

zu erhalten B TW Ich habe die Spalte nicht gelöscht, nachdem Sie alle neuen Wert erhalten, wenn Sie brauchen, können Sie es mit out=out.drop([columns],1)

+0

fallen lassen Wow .... das ist genial. Genau das suche ich. Ich bin verblüfft, wie wenig Code das ist. In Sql Server wäre das ein Albtraum !! Ich danke dir sehr!! – yanci

+0

@yanci wie wäre es mit meiner Antwort ~ ;-) – Wen

+0

wow so überrascht von dem Code, dass ich den wichtigen Teil vergessen habe! :-) – yanci

Verwandte Themen