2017-07-08 9 views
0

Ich habe zwei Pandas Datenrahmen und ich versuche, die rechte Tabelle auf der linken Tabelle, wo Neigung am nächsten zu den linken Tabellen 'Tiefe' aus den rechten Tabellen 'MeasuredDepth'?Python Pandas Calc Spalte

Beispiel linke Tabelle (Haupttabelle)

index  Date_Time   Depth 
6659 4/25/2017 1:26  2073.02 
6660 4/25/2017 1:26  2073.287 
6661 4/25/2017 1:26  2073.916 
6662 4/25/2017 1:26  2074.64 
6663 4/25/2017 1:26  2075.335 
6664 4/25/2017 1:26  2076.044 

Beispiel der rechte Tabelle (Referenztabelle)

index MeasuredDepth Inclination 
16  1844   1.42 
17  1939   1.69 
18  2034   1.43 
19  2128   1.39 
20  2223   1.12 
21  2317   1.22 
22  2412   1.1 
23  2600   0.56 
24  2695   1.97 

Beispiel Ergebnis Tabelle

index DATETIME  Depth  Inclination 
6659 4/25/2017 1:26  2073.02   1.43 
6660 4/25/2017 1:26  2073.287   1.43 
6661 4/25/2017 1:26  2073.916   1.43 
... 
26704 5/3/2017 23:23  2625.316   0.56 
26705 5/3/2017 23:23  2626.143   0.56 
26706 5/3/2017 23:24  2627.08   0.56 
26707 5/3/2017 23:24  2628.056   0.56 

Jede mögliche Hilfe würde geschätzt!

Antwort

0

die pd.merge_asof Lassen Sie verwenden:

ref_df['MeasuredDepth'] = ref_df['MeasuredDepth'].astype(float) 

df_out = pd.merge_asof(main_df, ref_df, left_on='Depth',right_on='MeasuredDepth') 

Ausgang:

 index_x Date_Time  Depth index_y MeasuredDepth Inclination 
0 4/25/2017  1:26 2073.020  18   2034.0   1.43 
1 4/25/2017  1:26 2073.287  18   2034.0   1.43 
2 4/25/2017  1:26 2073.916  18   2034.0   1.43 
3 4/25/2017  1:26 2074.640  18   2034.0   1.43 
4 4/25/2017  1:26 2075.335  18   2034.0   1.43 
5 4/25/2017  1:26 2076.044  18   2034.0   1.43 
+0

Siehe das obige Beispiel, um zu sehen, ob das Sinn macht. Danke – CodeStack82

0

Der beste und schnellste Weg wäre, die Werte entweder aufsteigend oder absteigend zu sortieren.

leftTable = leftTable.sort_values('Depth') 
rightTable = rightTable.sort_values('Merge') 
#reindex the data 
leftTable = leftTable.reset_index(drop=True) 
rightTable = rightTable.reset_index(drop=True) 

Jetzt gehen Sie für die Zusammenführung mit dem Index als Parameter.

Table = leftTable.join(rightTable, how = "outer") 

Die andere Alternative wäre für ein Iterationsverfahren zu gehen, die raubend Datenverlust nicht nur Zeit, sondern auch verursachen könnte. Wenn dies ein aufsteigender sortierter Datenrahmen für die linke Tabelle war (Daten leicht modifiziert).

index Date_Time Depth 
6659 4/25/2017 1:26 20 
6660 4/25/2017 1:26 21 
6661 4/25/2017 1:26 23 
6662 4/25/2017 1:26 24 
6663 4/25/2017 1:26 27 
6664 4/25/2017 1:26 28 

Und wenn dies war ein aufsteigendes sortiert Array für Right-Tabelle (für eine einfache geänderten Daten)

index MeasuredDepth Inclination 
16 1844 12 
17 1939 20 
18 2034 21 
19 2128 23 
20 2223 24 
21 2317 27 

Sie beide gleich groß sind. Wenn wir eine Funktion verwenden, um den Unterschied zwischen den Tiefenwerten jeder Zeile in beiden Tabellen zu messen, wird die Zeile mit der Tiefe 12 in der rechten Tabelle eindeutig nicht angehängt, da das Kriterium "Mindestabstand" ist Sind Sie in Ordnung mit dem Verlust von Daten, dann können Sie versuchen, über jede Zeile zu iterieren und die beste Übereinstimmung zu finden.

+0

Eine Iterationsmethode würde wahrscheinlich funktionieren. Nach dem Join sollte die Ergebnistabelle die gleiche Anzahl von Zeilen haben, aber eine neue Spalte 'Inclination', bei der der Neigungswert am nächsten mit der entsprechenden 'Depth' übereinstimmt. Vielen Dank für Ihre Unterstützung. – CodeStack82

+0

@ CodeStack82 Wie kann die Neigung der Tiefe am nächsten kommen?Kannst du es ausarbeiten? – Djokester

+0

Siehe Antwort und Bild oben. Danke – CodeStack82

0

Zum Beispiel Für jeden Tiefenwert in der linken Tabelle mag ich im Grunde einen ähnlichen Tiefenbereich in der rechten Tabelle sehen und gib die nächste Neigung für diese Tiefe zurück.

Das Problem ist, die 'Tiefe' Werte in 'Left Table' sind Zeitreihendaten so würde ich grundsätzlich eine Reihe von Werten alle 5 Sekunden erhalten. Die Spaltenwerte "Rechter Tisch" "MeasuredDepth" werden nur alle 95 Fuß erfasst. Ich versuche also nur, den nächsten Neigungswert aus der rechten Tabelle zu erhalten, der mit dem zufälligen 'Tiefenwert' in der linken Tabelle übereinstimmt.

enter image description here

+0

Entschuldigung für die verwirrende Antwort, noch neu zu Stack Overflow – CodeStack82

Verwandte Themen