Ich verwende häufig Pandas für die Zusammenführung (Join), indem ich eine Bereichsbedingung verwende.
Zum Beispiel, wenn es 2 Datenrahmen gibt:
A (A_id, A_value)
B (B_id, B_low, B_high, B_name)
die groß sind und ungefähr die gleiche Größe haben (sagen wir mal 2M Datensätze).
Ich würde gerne eine innere Verbindung zwischen A und B machen, also wäre A_value zwischen B_low und B_high.
Mit SQL-Syntax wäre das:
%Vor%und das wäre wirklich einfach, kurz und effizient.
In Pandas ist der einzige Weg (der keine Loops verwendet, die ich gefunden habe), in beiden Tabellen eine Dummy-Spalte zu erstellen, sich daran anzuschließen (entspricht einem Cross-Join) und dann nicht benötigte Zeilen herauszufiltern. Das klingt schwer und komplex:
%Vor%Eine andere Lösung, die ich hatte, besteht darin, auf jeden A-Wert eine Suchfunktion auf B anzuwenden, indem% code% mask verwendet wird, aber es klingt auch ineffizient und könnte eine Indexoptimierung erfordern.
Gibt es eine elegantere und / oder effizientere Möglichkeit, diese Aktion auszuführen?
Einrichtung
Betrachten Sie die Datenrahmen A
und B
numpy
Der ✌easiesty Weg besteht darin, numpy
broadcasting zu verwenden.
Wir suchen nach jeder Instanz von A_value
, die größer oder gleich B_low
ist, während gleichzeitig A_value
kleiner oder gleich B_high
ist.
Ich weiß nicht, wie effizient es ist, aber jemand hat einen Wrapper geschrieben, der es Ihnen ermöglicht, die SQL-Syntax mit Pandas-Objekten zu verwenden. Das nennt man pandasql . Die Dokumentation besagt explizit, dass Joins unterstützt werden. Dies könnte zumindest einfacher zu lesen sein, da die SQL-Syntax sehr gut lesbar ist.
Nicht sicher, dass das effizienter ist, aber Sie können sql direkt (z. B. aus dem Modul sqlite3) mit Pandas verwenden (inspiriert von dies Frage ) wie:
%Vor%Sie können die Abfrage bei Bedarf in Ihrer Anwendung anpassen
Bedenken Sie, dass Ihr A-Datenrahmen
ist %Vor%und B Datenrahmen ist
%Vor%Mit diesem Befehl erhalten Sie die gewünschte Ausgabe
%Vor%