Workshop - Daten mit OpenRefine umwandeln
Wir lernen verschiedene Methoden kennen um Daten aufzuräumen und umzuwandeln.
Daten transformieren in der OpenRefine Dokumentation.
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version 3.8.5.
Hintergrund
OpenRefine bietet unterschiedliche Arten an Daten umzuwandeln. Dies kann manuell auf Zellebene passieren, in einem “Facet”, auf Spaltenebene oder für bestimmte Aktionen auf dem kompletten Datensatz.
In den folgenden Aufgaben werden wir nun aktiv Daten filtern, umwandeln und zusammenführen.
Aufgabe 1: Leere Zeilen identifizieren und löschen
Wie in Aufgabe 3 in 02 Filtern und Sortieren verwenden wir das “Facet by blank (null or empty string)” um Leerzeilen zu identifizieren. Denn in den 4.000 Einträgen (rows) sollte es 5 Leerzeilen geben. Diese werden jedoch nicht angezeigt, da sie nicht leer sind, sondern Leerzeichen beinhalten.
Die Leerzeichen können wir global über “All" "Edit all columns" "Trim leading and trailing whitespace” entfernen.
Anschließend können wir, wie in Abbildung 1, mit dem “Facet by blank (null or empty string)” die Leerzeilen auswählen und via “All" "Edit rows" "Remove matching rows” entfernen.
Gehen Sie noch einmal zurück zu den Bildschirmfotos der Importeinstellungen in Projekte in OpenRefine laden und verwalten und vergleichen diese für Aufgabe 1 und 2.
Wir können Probleme mit Leerzeilen schon beim Importieren lösen, indem wir, wie bei Aufgabe 2, das Kontrollkästchen bei “Trim leading & trailing whitespace from strings” aktivieren und das Kontrollkästchen bei “Store blank rows” abwählen. Das ist jedoch nicht immer möglich, oder manchmal wird es vergessen.
Aufgabe 2: Geschlechter vereinheitlichen
Die Geschlechtsbezeichnungen in der Spalte “Geschlecht (m/w)” sind sehr uneinheitlich. Wir wollen dies vereinheitlichen, so dass überall nur noch die Werte “m” und “w” stehen.
Dafür testen wir mehrere Methoden.
1. Einzeln bearbeiten
Wenn wir mit der Maus über eine Zelle gehen, dann erscheint wie in Abbildung 2 eine blaue Bedienfläche mit der Bezeichnung “edit”. Darüber können wir einzelne Zellen bearbeiten.
Hinweise:
- Die Bearbeitung auf diesem Weg kann zwar rückgängig gemacht, aber nicht als Aktion exportiert werden!
2. Im Facet bearbeiten
Wenn wir mit der Maus über einen Wert im Facet gehen, dann erscheint wie in Abbildung 3 ein blauer “edit” Link. Darüber können wir alle Zellen mit diesem Wert in der Spalte gleichzeitig bearbeiten.
3. Ersetzen in der Spalte
Im Spaltenmenü findet sich unter “Geschlecht (m/w)“ "Edit cells" "Replace” ein Dialog, mit dem in dieser Spalte Ersetzungen durchgeführt werden können.
4. Textfilter und Transform
Eine andere Methode ist eine Kombination aus Textfilter und “Transform”. Im Spaltenmenü wählen wir “Geschlecht (m/w)“ "Textfilter” und geben im Eingabefeld des Filters nur den Buchstaben “w” ein, der praktischerweise in “männlich” nicht vorkommt.
Im “Text Facet” für die Spalte Geschlecht, sehen wir analog zu Abbildung 4 die gefilterten Werte.
Anschließend rufen wir den Dialog zum Transformieren über das Spaltenmenü via “Geschlecht (m/w)“ "Edit cells" "Transform…” auf.
In dem Dialog könnte komplexer Code geschrieben werden, wir wollen den Inhalt jeder Zelle jedoch einfach mit dem Wert "w"
ersetzen. Die Anführungszeichen sind wichtig, da wir dadurch OpenRefine mitteilen, dass wir den Wert w
meinen, und keinen Programmcode.
Aufgabe 3: Spalte akad. Grad/Titel vereinheitlichen
In der Spalte “akad. Grad/Titel” sind die akademischen Grade uneinheitlich geschrieben (siehe auch Abbildung 5). Überlegen Sie, welche der in Aufgabe 2 gelernten Methoden hier geeignet wäre und vereinheitlichen Sie die Titel.
Aufgabe 4: Spalten auftrennen
Bei den Ortsangaben sind der Ortsname und die GND-ID des Ortes mit |
getrennt in einer Zelle.
Wir wollen die Spalte “Geburtsort” auftrennen, so dass wir jeweils eine Spalte mit dem Ortsnamen und eine mit der zugehörigen GND-ID haben.
Dafür verwenden wir im Spaltenmenü den Dialog “Geburtsort" "Edit column" "Split into several columns…” mit den in Abbildung 6 gezeigten Einstellungen.
Anschließend entfernen wir überflüssige Leerzeichen via “Geburtsort" "Edit cells" "Common transforms" "Trim leading and trailing whitespace” und benennen die neuen Spalten entsprechend in “Geburtsort” und “Geburtsort (GND-ID)” um.
Hinweise:
- Mit Hilfe des regulären Ausdrucks
\s*\|\s*
hätten wir die Leerzeichen beim Aufsplitten auch direkt entfernen können. - Vielleicht sind Ihnen Zeilen aufgefallen, wo anstelle des Ortes nur die GND-ID steht. Um diese kümmern wir uns später.
Aufgabe 5: Spalten zusammenführen
Beim Sterbedatum haben wir das umgekehrte Problem. Hier ist das Datum in drei Spalten aufgeteilt, wir wollen jedoch eine Spalte haben. Bevor wir die Spalten zusammenführen, prüfen wir, ob die Werte in den einzelnen Spalten sinnvoll sind, und korrigieren die Werte bei Bedarf.
Anschließend rufen wir im Spaltenmenü den Dialog zum Zusammenführen von Spalten auf “Todesdatum (Tag)“ "Edit column" "Join columns…” mit den in Abbildung 7 gezeigten Einstellungen.
Aufgabe 6: Datum vereinheitlichen
In der Spalte “Geburtsdatum (exakt)” gibt es mehrere Formate für das Geburtsdatum:
- “31.03.1920”
- “31-03-1920”
- “31. März 1920”
OpenRefine bietet verschiedene Funktionen an, um mit Daten zu arbeiten.
Datumsfunktionen in der OpenRefine Dokumentation.
Um die Daten in ein einheitliches Format zu bringen, wandeln wir sie zuerst in ein Datumsobjekt um und schreiben sie anschließend als Text wieder raus.
Dafür müssen wir OpenRefine noch mitteilen, wie die Eingabe- und Zielformate aussehen:
- “dd.MM.yyyy”
- “dd-MM-yyyy”
- “dd. MMMM yyyy”
Um die Daten umzuwandeln öffnen wir den Dialog zum Transformieren über das Spaltenmenü von “Geburtsdatum (exakt)“ "Edit cells" "Transform” und verwenden den Ausdruck:
value.toDate("dd.MM.yyyy", "dd-MM-yyyy", "dd. MMMM yyyy").toString("dd.MM.yyyy")
Hinweise:
- OpenRefine bietet die Möglichkeit Programmcode zu nutzen um Transformationen durchzuführen. Dazu gehören Clojure/Python und die General Refine Expression Language (GREL).
- Die Datumsumwandlung gehört zu den Funktionen von GREL, die wir auf Grund ihrer Relevanz in diesen Einführungsworkshop mit aufgenommen haben.
Aufgabe 7: Daten mit Filter auf eine andere Spalte übertragen
In der Spalte “Geburtsort” ist bei einem Ort die GND-ID verrutscht und der Ortsname verloren gegangen. Bei dem Ort handelt es sich um “Breslau (Polen)” mit der GND-ID “4008216-7”.
Um dies zu beheben erstellen wir ein “Text Facet” für die Spalte “Geburtsort” und filtern nur die Einträge mit “4008216-7”. Es gibt nun verschiedene Möglichkeiten die Daten in die Spalte “Geburtsort (GND-ID)” zu übertragen.
- Zellen einzeln bearbeiten
- Ein weiteres “Text Facet” für die Spalte “Geburtsort (GND-ID)” erstellen und in beiden die Werte gesammelt bearbeiten.
- Die Werte via Textfilter oder “Text Facet” filtern und die Spalten zusammenführen ( “Geburtsort" "Edit column" "Join columns…”), ohne die Original Spalte zu löschen.
- Im Spaltenmenü via
“Geburtsort (GND-ID)“
"Edit cells"
"Transform”
die Daten aus der anderen Spalte mit dem Ausdruck
row.cells["Geburtsort"].value
kopieren.
Alle Varianten haben ihre Berechtigung und je nach Kontext oder Anwendungsfall eignet sich die ein oder andere eher.
Fazit
Die Kombination aus Facets/Filtern und den Bearbeitungsmöglichkeiten machen OpenRefine zu unserem Liebling beim Aufräumen von Daten (Data Cleaning). Manchmal vermissen wir es jedoch größere Bereiche manuell auszuwählen und in eine andere Spalte zu Verschieben.
Im nächsten Teil lernen wir verschiedene Exportmöglichkeiten in OpenRefine kennen.