Du versuchst Daten über einen Join zusammenzuführen, aber irgendwie sieht das Ergebnis nicht so aus wie du dir das vorgestellt hast?
Was für Arten von Joins gibt es eigentlich?
In diesem Teil gebe ich dir erst einen kurzen Überblick darüber, welche Joins es gibt.
Im Anschluss siehst du in der Praxis, wie sie eingesetzt werden.
Für diesen Teil nutzen wir die
preise.csv und produkte.csv
Hier kannst du sie herunterladen.
Im letzten Teil hast du die Funktionen merge und join kennengelernt.
Was ich dir dabei nicht gesagt hab ist, dass dabei automatisch ein inner Join durchgeführt wird.
Du hast also noch die Möglichkeit, anzugeben, wie genau die Daten zusammen geführt werden sollen.
Also, was du im Ergebnis sehen willst.
Und wie das funktioniert, das zeige ich dir in diesem Beitrag.
Was ist ein Join?
Ein Join sagt einfach nur, dass Daten aus zwei verschiedenen Quellen (Tabellen) zusammen gehören und zusammen geführt werden sollen.
Dabei wird immer eine Identifizierung angegeben.
Das können eine oder mehrere Spalten sein, die in beiden Tabellen vorhanden und entsprechend gleich sind.
Zum Beispiel eine Produktnummer.
Welche Arten von Joins gibt es?
Stell dir vor, du hast zwei Tabellen:
- Produkte
Hier sind alle Produkte enthalten, die von deiner Firma angeboten werden.
Du hast eine Artikelnummer, Kategorienummer, Gültigkeit, was man so braucht. - Preise
Hier sind alle Preise zu den Produkten enthalten.
Also Artikelnummer, Preis, Angebotspreis, etc.
Damit Daten zusammen geführt werden können, müssen die identifizierenden Spalten (in dem Beispiel die Artikelnummer) natürlich auch in beiden Tabellen vorhanden sein.
Was aber soll mit den Daten passieren, die eben genau dieses Kriterium nicht haben?
Vielleicht hast du Produkte ohne Preis?
Oder Preise, die kein Produkt mehr zugeordnet haben?
Willst du diese Daten dann trotzdem in deinem Ergebnis sehen?
Um genau das zu steuern, gibt es mehrere Arten von Joins:
- inner Join
Du bekommst nur Daten angezeigt, die auch wirklich in beiden Tabellen vorhanden sind
Du bekommst also alle Produkte, die auch einen Preis zugeordnet haben.
- outer Join
Du bekommst alle Daten, die zusammen gehören
+ alle Daten aus der linken Tabelle
+ alle Daten aus der rechten Tabelle
Du bekommst also alle Produkte, die einen Preis haben.
Alle Produkte, die keinen Preis haben.
Und alle Preise, die kein Produkt haben.
- left Join
Du bekommst alle Daten, die zusammen gehören
+ alle Daten aus der linken Tabelle
Du bekommst also alle Produkte, die einen Preis haben
Und alle Produkte, die keinen Preis haben
- right Join
Du bekommst alle Daten, die zusammen gehören
+ alle Daten aus der rechten Tabelle
Du bekommst also alle Produkte, die einen Preis haben
Alle Preise, die kein Produkt haben.
In der Praxis
Super, aber wie nutzt du sie jetzt?
Ja, jetzt kommt die Praxis!
Dazu habe ich einfach mal zwei CSV Dateien.
Eine hat Produktdaten, die Andere hat die Preisdaten zu den Produkten.
Als gemeinsamen Identifizierer haben sie die Artikelnummer.
Also erstmal die beiden Dateien einlesen:
import pandas as pd
produkte = pd.read_csv('/content/drive/MyDrive/produkt.csv', sep=';')
preise = pd.read_csv('/content/drive/MyDrive/preise.csv', sep=';')
Hier hast du zwei neue Dinge enthalten:
as pd
sep=';'
Das as pd ist einfach nur ein Alias.
Bei jedem Import erlaubt dir Python einen Alias zu vergeben, mit dem du das Modul später ansprechen kannst.
Für Pandas hat sich pd als Abkürzung eingebürgert. Du wirst sie also immer wieder finden.
Du könntest aber genauso pa oder meins oder was auch immer verwenden.
Es ist einfach nur die Anweisung an Pandas „Das Modul möchte ich bitte auch unter dem Namen ansprechen können“.
Und soll dir damit etwas Tipparbeit ersparen.
Das sep=’;’ steht für Separator.
Nicht jede CSV (Comma Separated Value) ist unbedingt auch mit einem Komma separiert worden.
Oft findest du wie hier Semikolon, Leerzeichen, Tabulatoren oder auch ganz andere Zeichen.
Um trotzdem die Trennung einfach zu ermöglichen, kannst du mit dem zusätzlichen Parameter angeben, wie die Werte in der Datei voneinander zu trennen sind.
Nachdem du die beiden Dateien eingelesen hast, siehst du, dass du elf Produkte und elf Preise hast.
Inner Join
Lass dir erstmal alle übereinstimmenden Datensätze anzeigen:
produkte.merge(preise, left_on='Artikelnummer', right_on='Produktnummer', how='inner')
Du siehst, zehn Produkte haben auch einen Preis zugeordnet.
In der Produkte Datei hast du eine Artikelnummer und in der Preise Datei eine Produktnummer.
Sie stellen dieselbe Nummer dar, die Spaltenbezeichnungen sind einfach nur unterschiedlich.
Deshalb musst du hier über die Parameter left_on und right_on angeben, welche Spalten zum Abgleich genutzt werden sollen.
Der Parameter how gibt an, welche Art von Join du benutzen möchtest.
Gibst du nichts an, wird automatisch ein inner Join durchgeführt.
Outer Join
Als Nächstes ein outer Join für alle Produkte mit Preis, alle Produkte ohne Preis und alle Preis ohne Produkt:
produkte.merge(preise, left_on='Artikelnummer', right_on='Produktnummer', how='outer')
Du siehst, das Produkt in Zeile elf (Index zehn) hat keinen Preis und der Preis in Zeile zwölf (Index elf) hat kein Produkt.
Zur Erinnerung:
NaN steht für Not a Number und wird immer dann eingesetzt, wenn kein Wert gefunden wurde.
Damit kannst du sofort sehen, bei welchen Produkten oder Preisen die entsprechend anderen Daten fehlen.
Left Join
Die linke Tabelle ist hier die Produkte Tabelle.
Also bekommst du jetzt alle Produkte, die einen Preis haben und alle Produkte, die keinen Preis haben.
Preise ohne Produkt werden dabei ignoriert:
produkte.merge(preise, left_on='Artikelnummer', right_on='Produktnummer', how='left')
Right Join
Und jetzt verhält es sich genau andersherum.
Du bekommst alle Produkte, die einen Preis haben und alle Preise, die kein Produkt haben.
Produkte ohne Preis werden ignoriert:
produkte.merge(preise, left_on='Artikelnummer', right_on='Produktnummer', how='right')
Zusammenfassung
Nochmal kurz zusammen gefasst:
Joins hast du nicht nur in Pandas!
Eigentlich kommen sie aus den relationalen Datenbanken.
Also aus dem SQL Bereich.
Mittlerweile sind sie aber auch in manchen Programmiersprachen, oder auch in Excel zu finden.
Inner Join:
Alle Daten, die in der linken und rechten Tabelle gefunden werden können
Outer Join:
Alle Daten, die in der linken und rechten Tabelle gefunden werden können
und alle Daten aus der linken Tabelle
und alle Daten aus der rechten Tabelle
Left Join:
Alle Daten, die in der linken und rechten Tabelle gefunden werden können
und alle Daten aus der linken Tabelle
Right Join:
Alle Daten, die in der linken und rechten Tabelle gefunden werden können
und alle Daten aus der rechten Tabelle
Außerdem hast du noch gelernt:
- mit dem Keyword as nach einem Import kannst du einen beliebigen Namen vergeben mit dem du das Paket / Modul ansprechen willst
- Mit dem Parameter sep in der Funktion read_csv kannst du angeben, wie die Werte in der CSV Datei voneinander getrennt wurden.
Anfang verpasst? Hier gehts zum vollen Kurs:
Ingo Janssen ist ein Softwareentwickler mit über 10 Jahren Erfahrung in der Leitung seines eigenen Unternehmens.
Er studierte Wirtschaftsinformatik an der TH Deggendorf und hat Softwareentwicklung an der FOM Hochschule in München unterrichtet.
Ingo hat mit einer Vielzahl von Unternehmen zusammengearbeitet, von kleinen und mittelständischen Unternehmen bis hin zu MDAX- und DAX-gelisteten Unternehmen.
Ingo ist leidenschaftlich daran interessiert, sein Wissen und seine Expertise mit anderen zu teilen. Aus diesem Grund betreibt er einen YouTube-Kanal mit Programmier-Tutorials und eine Discord-Community, in der Entwickler miteinander in Kontakt treten und voneinander lernen können.
Sie können Ingo auch auf LinkedIn, Xing und Gulp finden, wo er Updates über seine Arbeit teilt und Einblicke in die Tech-Branche gibt.
YouTube | Discord | LinkedIn | Xing | Gulp Profile