Den DataFrame (kurz: DF) aus der Python Bibliothek Pandas kann man sich am einfachsten als tabellenähnliches Objekt vorstellen bestehend aus Daten, die in Zeilen und Spalten gespeichert sind. Pandas bietet, einfach gesprochen, dieselben Möglichkeiten wie strukturierte Arrays in NumPy mit dem Unterschied, dass die Zeilen und Spalten mit Namen angesprochen werden können, statt sie mit Zahlenindex aufrufen zu müssen. Dadurch wird die Arbeit mit großen Datensätzen und vielen Spalten erleichtert und der Code verständlicher.
Was ist Pandas?
Pandas ist eine leistungsstarke Open-Source-Bibliothek zur Datenmanipulation für Python. Sie bietet eine leistungsstarke, einfach zu verwendende Datenstruktur namens DataFrame, die besonders nützlich für Datenanalyseaufgaben ist. Am einfachsten lässt sich Pandas als das „Excel von Python“ verstehen, denn viele Funktionalitäten aus Microsoft Excel lassen sich auch mit Pandas durchführen. Darüber hinaus besitzt Pandas jedoch noch viel mehr Funktionalitäten und ist auch deutlich performanter.
Was ist ein Pandas DataFrame?
Ein Pandas DataFrame ist eine zweidimensionale, beschriftete Datenstruktur, die einer Tabellenkalkulation oder SQL-Tabelle ähnelt. Sie besteht aus Zeilen und Spalten, wobei jede Spalte einen anderen Datentyp haben kann. Die Zeilen und Spalten sind mit einem eindeutigen Index bzw. Spaltennamen versehen, was das Auswählen, Filtern und Manipulieren von Daten erleichtert.

Wie können DataFrames verstanden werden?
Bevor wir uns dem Erstellen von DFs widmen können, müssen wir verstehen aus welchen Objekten sich dieser zusammensetzen kann. Dieses Wissen ist nötig, da es verschiedene Wege gibt, DFs zu erstellen und diese davon abhängen, welches Datenobjekt man als Grundlage nutzt. Nur so lässt sich auch die Möglichkeiten verstehen, die man mit DFs hat und die diese auch deutlich abheben von den reinen Tabellen, mit denen sie oft verglichen werden.
Um die nachfolgenden Abschnitte zu verstehen, ist ein grundlegendes Wissen zu Datenstrukturen in Python und Pandas die Grundvoraussetzung. Falls Du dieses nicht hast oder Deine Kenntnisse auffrischen willst, nutze gerne unsere Beiträge zum Thema Pandas Series und Python Dictionary.

DataFrame als Sammlung von Series Objekten
Das Series Objekt in Pandas ist ein ein-dimensionales Array mit einem veränderbaren Index für das Aufrufen von einzelnen Einträgen. In Python kann man ein solches Objekt mit folgendem Befehl erstellen:
import pandas as pd
area_dict = {‘California’: 423967, ‘Texas’: 695662, ‘New York’: 141297, ‘Florida’: 170312, ‘Illinois’: 149995}
area = pd.Series(area_dict)
Die Series hat als Index verschiedene amerikanische Bundesstaaten und die zugehörige Fläche des Staates in km². Eine zweite Series mit demselben Index, also den gleichen fünf amerikanischen Staaten, enthält die Einwohnerzahl pro Staat.
population_dict = {‘California’: 38332521, ‘Texas’: 26448193, ‘New York’: 19651127, ‘Florida’: 19552860, ‘Illinois’: 12882135}
population = pd.Series(population_dict)
Da beide Series Objekte den gleichen Index besitzen, können wir sie zu einem DataFrame Objekt zusammenfassen, mit den Indexwerten (die fünf Staaten) als Zeilen und die Kategorien (Fläche und Einwohnerzahl) als Spalten:
states_df = pd.DataFrame({‘population’: population, ‘area’: area})
Genau wie die Series Objekte davor, hat auch der DF weiterhin ein Index, über den die Zeilen gezielt angesprochen werden können:
states.index
Zusätzlich haben können auch die Spalten des tabellenähnlichen DFs über ihre Namen aufgerufen werden:
states.columns
DataFrame als spezialisiertes Dictionary
Ein anderer Ansatz zur Interpretation von DataFrame Objekten ist es als spezialisiertes Dictionary zu sehen, bei dem der DF eine Spalte auf ein Series Objekt innerhalb der Spalte verweist, genau wie ein Dictionary einen Key zu einem Wert zuordnet. Wir können es auch genauso abfragen wie ein Dictionary und erhalten dabei jedoch die ganze Spalte und nicht nur einen speziellen Wert:
states[‘area’]
Wie erstellt man einen Pandas DataFrame?
Im Allgemeinen gibt es vier verschiedene Wege einen DF zu erstellen, die abhängig vom Use Case alle nützlich sein können:
- Aus einem einzelnen Series Objekt. Der DF ist eine Sammlung aus mehreren Series Objekten. Er kann jedoch auch aus einer einzelnen Series erstellt werden und weist dann nur eine Spalte auf:
pd.DataFrame(population, columns=[‘Population’]
- Aus einer Liste von Dictionaries. Selbst wenn nicht alle Dictionaries dieselben Keys besitzen, werden die fehlenden Werte mit NaN (‘not a number’) aufgefüllt. Die Anzahl der Spalten ergibt sich somit aus der Anzahl an eindeutigen Keys und die Zahl der Zeilen aus der Zahl an Dictionaries:
pd.DataFrame([{'a': 1, 'b': 2}, {'b': 3, 'c': 4}])
- Aus einem Dictionary von Series Objekten. Dieser Weg wurde bereits in den Abschnitten zuvor ausführlich beschrieben:
pd.DataFrame({‘population’: population, ‘area’: area})
- Aus einem zweidimensionale Numpy Array. Mehrere zweidimensionale Numpy Arrays können in einem DF zusammengefasst werden. Wenn keine Bezeichnungen als Spaltennamen gepflegt sind, werden Zahlen als Spaltenindex genutzt:
pd.DataFrame(np.array([[1, 2], [3, 4]]), columns=[col1, col2'], index=['row1', row2’])
Wie kann eine Excel- oder CSV-Datei eingelesen werden?
Wenn man nicht ein neues Objekt erstellen will und stattdessen auf eine bereits vorhandene Datei zurückgreifen will, lässt sich dies auch mit Pandas umsetzen. Mithilfe der Funktionen „read_csv()“ oder „read_excel()“ lassen sich die entsprechenden Dateien auslesen und werden direkt in einen DataFrame umgewandelt.
import pandas as pd
df = pd.read_csv("name_of_csv.csv")
df2 = pd.read_excel("name_of_excel.xlsx")
Wichtig ist hierbei, dass man auch die richtige Endung der Datei im Namen mit beachtet. Ansonsten kann es zu Fehlern kommen.
Kann man einen DataFrame in einer for-Schleife erstellen?
In anderen Programmiersprachen, wie R, ist es normal ein leeres Objekt zu erstellen und es dann mit einer for-Schleife schrittweise zu füllen, so wie man es in Python beispielsweise mit Listen tun kann. Diese Vorgehensweise ist bei Pandas DF zwar möglich, sollte aber, wenn möglich, nicht genutzt werden. Die Daten sollten erst in Listen oder Dictionaries gespeichert werden und dann in einem Schritt als DataFrame zusammengefasst werden. Diese Vorgehensweise spart massiv Zeit und Speicherkapazitäten (vgl. auch Stack Overflow).
Welche Best Practices gilt es bei der Arbeit mit Pandas DataFrames zu beachten?
Pandas DataFrames sind unglaublich vielseitig und leistungsstark, aber um das Beste aus ihnen herauszuholen und gängige Fehler zu vermeiden, ist es wichtig, einige bewährte Methoden und Tipps zu befolgen. Ob Du ein Anfänger oder ein erfahrener Datenanalyst bist, diese Richtlinien helfen Dir, effizienter und effektiver mit DataFrames zu arbeiten.
1. Pandas richtig importieren
Wenn Du ein Python-Skript oder ein Jupyter Notebook startest, importiere Pandas immer richtig:
import pandas as pd
Diese Konvention zeigt klar, dass Du Pandas verwendest und vereinfacht Deinen Code.
2. Verwende read_csv
und read_excel
für die Dateneingabe
Beim Einlesen von Daten aus externen Quellen wie CSV-Dateien oder Excel-Tabellen verwende pd.read_csv()
und pd.read_excel()
Funktionen. Diese Funktionen behandeln verschiedene Dateiformate und können automatisch Datentypen erkennen.
df = pd.read_csv('daten.csv')
3. Setze den Index klug
Wähle eine geeignete Spalte als DataFrame-Index aus, insbesondere bei der Arbeit mit Zeitreihendaten. Das Festlegen des Index verbessert die Leistung bei der Datenabfrage und erleichtert die Datenmanipulation.
df.set_index('datum', inplace=True)
4. Vermeide das Iterieren über Zeilen
Pandas ist für vektorisierte Operationen konzipiert. Vermeide das Iterieren über DataFrame-Zeilen mit Schleifen, wann immer möglich; stattdessen verwende integrierte Funktionen für Operationen auf ganzen Spalten.
# Schlechte Praxis (langsam):
for index, row in df.iterrows():
df.at[index, 'neue_spalte'] = row['alte_spalte'] * 2
# Bessere Praxis (schneller):
df['neue_spalte'] = df['alte_spalte'] * 2
5. Verwende .loc
und .iloc
für die Auswahl
Beim Auswählen von Zeilen oder Spalten verwende .loc
und .iloc
für die indexbasierte und integerbasierte Indexierung. Dies ist effizienter als die traditionelle Klammerschreibweise.
# Indexbasierte Auswahl
df.loc[df['spalte'] > 5]
# Integerbasierte Auswahl
df.iloc[2:5, 1:3]
6. Vermeide verschachtelte Indizierungen
Verschachtelte Indizierungen, wie z.B. df['spalte']['zeile']
, können zu unvorhersehbarem Verhalten führen und sollten vermieden werden. Verwende .loc
oder .iloc
für eine explizite und eindeutige Indexierung.
# Schlechte Praxis (verschachtelte Indizierung)
df['spalte']['zeile']
# Bessere Praxis (explizite Indexierung)
df.loc['zeile', 'spalte']
7. Behandle fehlende Daten angemessen
Verwende Methoden wie .isna()
, .fillna()
oder .dropna()
, um mit fehlenden Daten umzugehen. Die Entscheidung, ob fehlende Werte ersetzt, entfernt oder belassen werden sollen, hängt von Deiner Analyse und Deinem Datensatz ab.
# Ersetze fehlende Werte durch den Mittelwert
df['spalte'].fillna(df['spalte'].mean(), inplace=True)
8. Vermeide In-Place-Änderungen
Während In-Place-Änderungen nützlich sein können, können sie auch zu unerwarteten Änderungen führen. Sei vorsichtig bei der Verwendung von Methoden wie .drop()
oder .fillna()
in Place. Erwäge stattdessen die Erstellung eines neuen DataFrames.
# In-Place-Änderung (mit Vorsicht verwenden)
df.drop('spalte', axis=1, inplace=True)
# Sicherer Ansatz (erstellt einen neuen DataFrame)
neuer_df = df.drop('spalte', axis=1)
9. Optimiere den Speicherverbrauch
DataFrames können viel Speicherplatz beanspruchen, insbesondere bei großen Datensätzen. Um den Speicherverbrauch zu optimieren:
- Wähle geeignete Datentypen aus (z.B.
int
stattfloat
, wenn die Genauigkeit nicht entscheidend ist). - Verwende den Datentyp
category
für Spalten mit einer begrenzten Anzahl von eindeutigen Werten. - Konvertiere numerische Spalten mit konstanten Werten in einen einzelnen Wert.
df['kategorie_spalte'] = df['kategorie_spalte'].astype('category')
10. Dokumentiere Deinen Code und Deinen Arbeitsablauf
Die Datenanalyse kann komplex werden. Dokumentiere Deinen Code, gib klare Erklärungen in Kommentaren ab und führe Aufzeichnungen Deiner Datenbereinigungs- und Analysevorgänge, um Deine Arbeit reproduzierbar zu machen.
# Dieser Code reinigt und bereitet die Daten auf
df_bereinigt = bereinige_daten(df)
# Speichere die bereinigten Daten in einer neuen Datei
df_bereinigt.to_csv('bereinigte_daten.csv', index=False)
Indem Du diese bewährten Methoden und Tipps befolgst, kannst Du Deine Datenanalyseprojekte mit Pandas DataFrames effizienter, wartbarer und weniger fehleranfällig gestalten. Denke daran, dass Pandas eine umfangreiche Funktionalität bietet, daher ist das Erkunden der offiziellen Dokumentation und das Erlernen neuer Techniken ein wertvoller Teil Deiner Reise als Datenanalyst oder -wissenschaftler.
Das solltest Du mitnehmen
- Der Pandas DataFrame ist ein sehr wichtiges Element bei der Datenaufbereitung für Künstliche Intelligenz.
- Er kann am ehesten als SQL-Tabelle verstanden werden mit Zeilen und Spalten, bietet darüber hinaus jedoch noch mehr Funktionalitäten.
- Der DataFrame kann sowohl als Sammlung von Series Objekten verstanden werden oder als spezialisiertes Dictionary.
- Er kann entweder aus einem einzelnen Series-Objekt, aus einer Liste von Dictionaries, aus einem zweidimensionalen NumPy Array oder aus einem Dictionary von Series Objekten erstellt werden.
- Darüber hinaus gibt es die Möglichkeit den DataFrame direkt aus einer Datei, wie beispielsweise aus einer CSV- oder Excel-Datei einzulesen.
Andere Beiträge zum Thema Pandas DataFrame
- Die offizielle Dokumentation von Pandas findest Du hier.