fbpx

#10 – Was sind Joins?

Inhalt
    Add a header to begin generating the table of contents

    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:

    Titelbild - Excel zu Python - free
    Ingo Janßen

    Ingo Janßen

    Lerne nicht einfach programmieren. Löse Probleme und automatisiere Aufgaben!

    Das könnte dich auch interessieren

    Nach oben scrollen
    Newsletter Popup Form

    Keine Inhalte mehr verpassen?

    Melde dich direkt für den "Code-Kompass" an und erhalte nützliche Tipps und Informationen direkt in deinen Posteingang.