2017-03-28 4 views
1

Jetzt muss ich zwei Datenrahmen mit der Bedingung größer als (> =) zusammenführen. Aber nur Unterstützung gleich zusammenführen. Gibt es eine Möglichkeit, damit umzugehen? Vielen Dank!Funktioniert Pandas Dataframe Merge mit mehr oder weniger?

+3

Ich glaube nicht, dass das stimmt, können Sie Datenrahmen indizieren und in Scheiben schneiden, die jede gewünschte Bedingung verwenden. Kannst du deine Frage erklären? Wie sehen Ihre Rahmen aus, wie möchten Sie, dass sie usw. aussehen? – umutto

+0

Vielen Dank für Ihre Antwort. Zum Beispiel habe ich Datenrahmen A und B, ich muss sie innerlich mit der Bedingung zusammenführen, dass A.Column1> = B.Column1 und A.Column1 <= B.Column2. In SQL ist dies sehr einfach: Wählen Sie * aus A inner Join B auf A.Column1> = B.Column1 und A.Column1 <= B.Column2, aber in Pandas kann ich keine Möglichkeit finden, damit umzugehen :( –

Antwort

0

Ich weiß nicht, wie die folgend mit ähnlicher Zusammenführung zu erreichen und Join-Syntax in Pandas,

SELECT * 
FROM a 
INNER JOIN b 
ON a.column1 >= b.column1 AND a.column1 <= b.column2 

Aber die obigen Abfrage kann auch implizit geschrieben werden;

SELECT * 
FROM a, b 
WHERE a.column1 >= b.column1 AND a.column1 <= b.column2 

Das ist im Grunde die alte Syntax und sollte genau dasselbe (Leistung) tun. Es nimmt das kartesische Produkt von 2 Tabellen (oder Cross-Join) und wählen Sie dann aus dem Verwenden der WHERE-Bedingung, die leicht in Pandas implementiert werden könnte. Dies könnte ein wenig schwer in Erinnerung sein, sollte aber schnell sein.

Zuerst die FROM a, b Klausel (wir ordnen vorübergehend eine Spalte mit denselben Werten in allen Reihen zu, also können wir uns über ihn verbinden);

df = pd.merge(a.assign(key=0), b.assign(key=0), on='key').drop('key', axis=1) 

und verwenden dann boolean Indexierungs (unser WHERE Satz) um den Rahmen zu schneiden;

df[(df["column1_x"] >= df["column1_y"]) & (df["column1_x"] <= df["column2_y"])] 

Wenn Sie nicht das kartesische Produkt und wollen nur die Zeilen auf denselben Index der beiden Tabellen vergleichen, können Sie auf den Index wie folgt zusammenführen können;

df = a.merge(b, left_index = True, right_index = True) 

oder concat auf die Achse 1, wenn sie dieselbe Länge;

df = pd.concat([a, b], axis=1) 

Und verwenden Sie boolesche Indizierung erneut, um Ergebnisse zu beseitigen;

df[(df["column1_x"] >= df["column1_y"]) & (df["column1_x"] <= df["column2_y"])] 
+1

Vielen Dank! Diese Arbeit für mich. Sehr zu schätzen wissen! –