Tabellen lang und breit

Daten lassen sich in Tabellen auf zwei Arten darstellen, im wide-Format und im long-Format. Das Titelbild gibt einen ersten Eindruck für den Unterschied.

Beim wide-Format spielen die Spalten eine größere Rolle und wichtige Informationen befinden sich in den Überschriften der Spalten. Beim long-Format ist die Tabelle hingegen so gestaltet, dass eine Zeile alle notwendigen Informationen enthält. Es gibt auch einen eigenen ausführlichen Artikel in der Wikipedia zu dem Thema Wide-Format und Long-Format.

Der reinen Lehre nach hat eine Tabelle im long-Format nur eine einzige Spalte mit (Mess-)Werten. Alle vorherigen Spalten sind Metadaten zu diesem Wert.

Beispiele für Tabellen im wide-Format gibt es im Open-Data-Portal Schleswig-Holstein reichlich. Hier z.B. die gemeldete Corona Fälle - Daten zu den Altersgruppen

Für das long-Format (in der Reinform) habe ich nur bislang nur einen einzigen Datensatz im Open-Data-Portal Schleswig-Holstein finden können: Corona-Zahlen Kreis Stormarn

| Datum      | Ort                | Neu Infizierte | 
| ---------- | ------------------ | -------------- |
| 2021-12-01 | Stadt Ahrensburg   | 51             |
| 2021-12-01 | Stadt Bad Oldesloe | 31             |
| 2021-12-01 | Stadt Bargteheide  | 24             |
[...]
| 2021-12-28 | Stadt Ahrensburg   | 54             |
| 2021-12-28 | Stadt Bad Oldesloe | 41             |

Ein großer Vorteil des long-Formats ist es, dass man auch mehr als zwei Dimensionen darstellen kann. Schauen wir uns das am Beispiel der schon genannten Corona-Fallzahlen nach Altergruppen an. Die Tabelle mit den Zahlen für den 15. Februar 2022 beginnt so:

| Altersgruppe | weiblich | männlich | Hospitalisierungen | Verstorben |
| ------------ | -------- | -------- | ------------------ | ---------- |
| 00-04        | 3.612    | 3.862    | 62                 | 0          |
| 05-09        | 8.363    | 9.052    | 41                 | 0          |
| 10-14        | 7.760    | 9.044    | 40                 | 0          |

Sie liegt offenbar im wide-Format vor. Für jeden Tag muss daher eine neue Tabelle erstellt werden. Im long-Format hingegen würde die Tabelle so aussehen:

| Datum      | Altersgruppe | Angabe                   | Wert |
| ---------- | ------------ | ------------------------ | ---- |
| 2022-02-15 | 00-04        | Gemeldete Fälle weiblich | 3612 |
| 2022-02-15 | 05-09        | Gemeldete Fälle weiblich | 8363 |
| 2022-02-15 | 10-14        | Gemeldete Fälle weiblich | 7760 |
| 2022-02-15 | 00-04        | Gemeldete Fälle männlich | 3862 |
| 2022-02-15 | 05-09        | Gemeldete Fälle männlich | 9052 |
| 2022-02-15 | 10-14        | Gemeldete Fälle männlich | 9044 |
| 2022-02-15 | 00-04        | Hospitalisierungen       |   62 |
| 2022-02-15 | 05-09        | Hospitalisierungen       |   41 |
| 2022-02-15 | 10-14        | Hospitalisierungen       |   40 |
| 2022-02-15 | 00-04        | Verstorben               |    0 |
| 2022-02-15 | 05-09        | Verstorben               |    0 |
| 2022-02-15 | 10-14        | Verstorben               |    0 |

Auf ersten Blick siehte diese Tabelle etwas “geschwätziger” aus. Man erkennt aber schnell, dass man Werte des nächsten Tages einfach am Ende anhängen kann und keine weitere Tabelle benötigt.

Umwandlung zwischen beiden Formen

Das was macht man, wenn die Tabelle in dem anderen Format vorliegt als man gerne hätte?

Python Pandas

Mit Python Pandas gelingt die Umwandlung mit Hilfe der Funktion melt leicht. Hier am schon bekannten Beispiel der Corona-Fallzahlen nach Altergruppen die Umwandlung wide→long.

import pandas as pd
df = pd.read_csv('https://opendata.schleswig-holstein.de/collection/cvd-sh-alter/aktuell.csv')
df_wide = df.dropna()
df_long = pd.melt(df_wide, id_vars=['Altersgruppe'], var_name='Angabe', value_name='Wert')
df_long

Entscheidend ist die vorletzte Zeile, die letzte gibt nur das Ergebnis aus. Die Spalte Altersgruppe soll beibehalten werden, die übrigen Spalten sollen zu Zeilen aufgelöst werden. Die Spalte, die die ehemaligen Spaltenüberschriften aufnimmt, bekommt den Namen Angabe, die Spalte mit den Zahlen den Namen Wert.

In die andere Richtung geht es mit der Pandas-Funktion pivot:

pd.pivot(df_long, index='Altersgruppe', columns='Angabe',  values='Wert')

LibreOffice Calc

Die Umwandlung long→wide lässt sich auch mit LibreOffice Calc einfach bewerkstelligen. Das kann man die Funktion Daten → Pivot-Tabelle → Einfügen oder Bearbeiten… verwenden. Es erscheint der Dialog zum Zuordnen der vorhandenen Spalten:

Dialogfenster zum Erstellen der Pivot-Tabelle

Wenn man die verfügbaren Felder passend zuordnet, entsteht die gewünschte Ausgabe im wide-Format.

Ergebnistabelle im wide-Format in LibreOffice Calc