Spalten / Zeilen erstellen, löschen und sortieren in pandas

In diesem Beitrag geht es um 3 zentrale Techniken, die wohl in jedem Datenmanagementprozess gebraucht werden: Das Erstellen, Löschen und Sortieren von Spalten und Zeilen in einem pandas-DataFrame.

Inhalt

Die 3 Techniken werden wir an einem kleinen Beispieldatensatz durchführen und erläutern:

In [22]:
import pandas as pd
import numpy as np
df = pd.DataFrame({'Name' : ["Peter", "Karla", "Anne", "Nino", "Andrzej"],
                   'Alter': [34, 53, 16, 22, 61],
                   'Nationalität': ["deutsch", "schweizerisch", "deutsch", "italienisch", "polnisch"],
                   'Gehalt': [3400, 4000, 0, np.NaN, 2300]}, 
                  index = ['ID-123', 'ID-462', 'ID-111', 'ID-997', 'ID-707'],
                 columns = ['Name', 'Alter', 'Nationalität', 'Gehalt'])

print(df)
           Name  Alter   Nationalität  Gehalt
ID-123    Peter     34        deutsch  3400.0
ID-462    Karla     53  schweizerisch  4000.0
ID-111     Anne     16        deutsch     0.0
ID-997     Nino     22    italienisch     NaN
ID-707  Andrzej     61       polnisch  2300.0

Spalten und Zeilen erstellen

Für das Anlegen neuer Variablen existieren je nach Problemstellung unterschiedliche Techniken. Allen Methoden ist dabei gemeinsam, dass sie eine neue Variable über eine Zuweisung an den Datensatz anhängen. Die Zuweisung erfolgt über die klassischen Indizierungstechniken für DataFrames [Hier erfahren Sie mehr über Indizierungstechniken auf DataFrames].

Grundsätzlich sind 3 Szenarien denkbar, wie eine Variable erzeugt wird:

[Anmerkung: Zur besseren Lesbarkeit des Artikels wird lediglich ausführbarer Quellcode dargestellt.]

1. Die Variable soll mit einem Skalar initiiert werden.

df['NeueVariable'] = np.nan
df['NeueVariable2']= 0

2. Sie soll sich aus bestehenden Variablen berechnen.

Aus unserem Datensatz können wir bspw. das Geburtsjahr der Personen berechnen. Dafür wird die gesamte Series elementweise von dem skalaren Wert 2018 subtrahiert. Um das Nettogehalt der Personen zu berechnen, multiplizieren wir jede Zeile mit dem Nettosatz des Herkunftslandes (die Zahlen sind frei erfunden). Die Liste mit der wir multiplizieren, muss die gleiche Länge wie die Series haben, mit der die Transformation durchgeführt wird.

df['Geburtsjahr'] = 2018-df['Alter']
df['Nettogehalt'] = df['Gehalt'] * [0.62,0.75,0.62,0.68,0.71]

3. Die Variable liegt als eigenes Objekt vor.

Je nach Objekttp – Liste, Dictionary oder Series – erfolgt das Anhängen von Daten an einen DataFrame auf unterschiedliche Weise.

Liste

# Liegen die Daten als Liste vor, wird diese in ihrer Reihenfolge an den Datensatz angehangen.
Nachname = ['Müller', 'Bruni', 'Bonke', 'Wojcek', 'Bonucci']
df['Nachname'] = Nachname

Dictionary

Grundsätzlich sollte ein Dictionary zunächst in eine Series umgewandelt werden, bevor dessen Werte an einen DataFrame angehangen werden. Warum das so ist? Ein Dictionary verfügt über keine innere Sortierung. Wenn wir bspw. ein Dictionary über dessen Literal erstellen, wird es beim Anhängen an den DataFrame anhand seiner Keys sortiert (irgendwie muss ja sortiert werden). Die neue Sortierung entspricht dabei keineswegs unserer Eingabe. Problematisch ist außerdem, dass die Keys anstatt der Werte angehangen werden. Also Achtung: Eine Zuordnung an den Index des DataFrames findet bei Dictionaries nicht statt!

Also nochmal: Ein Dictionary wird an einen DataFrame angehangen, indem es vorher zu einer Series konvertiert wurde. Die Series wird an den DataFrame mit Hilfe des Indizes gejoint.

df['Nachname'] = pd.Series(Nachname)

Series
Dieser Ansatz entspricht dem obigen Beispiel für Dictionaries. Eine Series wird anhand ihres Indizes an den DataFrame gejoint.

Nachname = pd.Series(data = ['Bruni', 'Bonke', 'Wojcek', 'Müller', 'Bonucci'],
                    index=['ID-462', 'ID-111', 'ID-707', 'ID-123', 'ID-997'])
df['Nachname'] = pd.Series(Nachname)

Zeilen an den DataFrame anhängen

Liegen die Werte einer neuen Zeile als Liste vor, kann diese über die Zuweisung mithilfe der Property loc an den Datensatz angefügt werden. Innerhalb der loc Anweisung vergeben wir einen neuen Identifier für die Zeile.

df.loc['ID-999',:] = ['Karl',45,'deutsch',3200]

Liegen die Daten als Dictionary vor, sollte dieses unbedingt zu einer Series umgewandelt werden, bevor die Daten an den Datensatz angehangen werden.

new_row = {'Nationalität': 'deutsch', 'Name': 'Karl', 'Alter':33,  'Gehalt': 800}
new_row = pd.Series(new_row)
df.loc['ID-333',:] = new_row

Spalten und Zeilen löschen

Für das Löschen von Spalten existieren 2 Wege. Eine Möglichkeit ist, mit dem Keyword del zu arbeiten, welches zur Standarddistribution von Python gehört. Eine anderer Weg ist es, die in pandas implementierte Methode drop zu wählen. Diese verfügt über ein Argument axis welches Standardmäßig durch den Wert 0 auf die Zeilen referenziert. Soll eine Spalte gelöscht werden, muss dieses Argument auf den Wert 1 gesetzt werden.

Spalten

df.drop('Gehalt', axis=1)
del df['Gehalt']

Zeilen

df.drop(['ID-123', 'ID-707'], axis=0)

Spalten und Zeilen sortieren

Spaltensortierung

Die Spaltensortierung erfolgt in 3 Schritten:

  1. Extrahieren der Spaltennamen und als Liste ablegen
  2. Umsortieren der Liste
  3. Umsortieren des DataFrames über die Property loc.
    cols = list(df.columns)
    cols = cols[::-1]
    # Sortierung mit numpy-Indizierung (etwas schneller als pandas)
    df[cols]
    # Sortierung mit pandas-Property
    df.loc[:,cols]
    

Natürlich können die Spaltennamen auch händisch als Liste angelegt werden:

df.loc[:,['Gehalt', 'Nationalität', 'Alter', 'Name']]

Zeilensortierung

Für das Sortieren der Zeilen existiert die Methode sort. Soll nach dem Index sortiert werden, kann dies mit der Methode sort_index umgesetzt werden.

df.sort('Alter',ascending=True)
df.sort(['Nationalität','Gehalt'],ascending=[False,True])

df.sort_index()
In [ ]: