Python
Pandas-DataFrame mühelos sortieren: Ein Anfängerguide

Pandas-DataFrame mühelos sortieren: Ein Anfängerguide

MoeNagy Dev

Die Grundlagen des Sortierens

Die Bedeutung des Sortierens in der Datenanalyse verstehen

Das Sortieren von Daten ist eine grundlegende Operation in der Datenanalyse und ist oft ein entscheidender Schritt bei der Vorbereitung von Daten für weitere Verarbeitung, Visualisierung und Entscheidungsfindung. Das Sortieren kann Ihnen dabei helfen:

  • Daten auf logische und sinnvolle Weise zu organisieren
  • Muster und Trends einfacher zu identifizieren
  • Effiziente Daten-Suchvorgänge und -Abfragen durchzuführen
  • Datenanalyse und Berichterstellung zu erleichtern
  • Die Gesamtqualität und Benutzerfreundlichkeit Ihrer Daten zu verbessern

Einführung in die Methode sort_values() in Pandas

In Pandas ist die Methode sort_values() die Hauptmethode zum Sortieren eines DataFrames. Diese Methode ermöglicht es Ihnen, den DataFrame anhand einer oder mehrerer Spalten in aufsteigender oder absteigender Reihenfolge zu sortieren.

import pandas as pd
 
# Erstelle einen Beispieldatensatz
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie', 'David'],
                   'Age': [25, 30, 35, 40],
                   'Score': [85, 92, 78, 88]})
 
# Sortiere den DataFrame nach der Spalte 'Age'
sorted_df = df.sort_values(by='Age')
print(sorted_df)

Ausgabe:

     Name  Age  Score
0  Alice   25     85
1    Bob   30     92
2 Charlie   35     78
3  David   40     88

Sortieren nach einer einzelnen Spalte

Um einen DataFrame nach einer einzelnen Spalte zu sortieren, geben Sie einfach den Spaltennamen als Argument für den Parameter by der Methode sort_values() an.

# Sortiere den DataFrame nach der Spalte 'Score' in aufsteigender Reihenfolge
sorted_df = df.sort_values(by='Score')
print(sorted_df)

Ausgabe:

       Name  Age  Score
2  Charlie   35     78
0    Alice   25     85
3    David   40     88
1      Bob   30     92

Sortieren nach mehreren Spalten

Sie können einen DataFrame nach mehreren Spalten sortieren, indem Sie eine Liste von Spaltennamen an den Parameter by übergeben.

# Sortiere den DataFrame nach der Spalte 'Age' in aufsteigender Reihenfolge und der Spalte 'Score' in absteigender Reihenfolge
sorted_df = df.sort_values(by=['Age', 'Score'], ascending=[True, False])
print(sorted_df)

Ausgabe:

     Name  Age  Score
0  Alice   25     85
1    Bob   30     92
2 Charlie   35     78
3  David   40     88

Sortieren in aufsteigender und absteigender Reihenfolge

Sortieren in aufsteigender Reihenfolge

Standardmäßig sortiert die Methode sort_values() den DataFrame in aufsteigender Reihenfolge. Sie können explizit den Parameter ascending auf True setzen, um in aufsteigender Reihenfolge zu sortieren.

# Sortiere den DataFrame nach der Spalte 'Age' in aufsteigender Reihenfolge
sorted_df = df.sort_values(by='Age', ascending=True)
print(sorted_df)

Ausgabe:

     Name  Age  Score
0  Alice   25     85
1    Bob   30     92
2 Charlie   35     78
3  David   40     88

Sortieren in absteigender Reihenfolge

Um den DataFrame in absteigender Reihenfolge zu sortieren, setzen Sie den Parameter ascending auf False.

# Sortiere den DataFrame nach der Spalte 'Age' in absteigender Reihenfolge
sorted_df = df.sort_values(by='Age', ascending=False)
print(sorted_df)

Ausgabe:

     Name  Age  Score
3  David   40     88
2 Charlie   35     78
1    Bob   30     92
0  Alice   25     85

Umgang mit fehlenden Werten beim Sortieren

Pandas behandelt fehlende Werte (dargestellt durch NaN) während des Sortierens, indem sie sie entweder am Anfang oder am Ende des sortierten DataFrames platzieren, abhängig vom Parameter na_position.

# Erstelle einen DataFrame mit fehlenden Werten
df_with_na = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Emily'],
                           'Age': [25, 30, None, 40, 35],
                           'Score': [85, 92, 78, None, 88]})
 
# Sortiere den DataFrame nach der Spalte 'Age' und platziere NaN-Werte am Anfang
sorted_df = df_with_na.sort_values(by='Age', na_position='first')
print(sorted_df)

Ausgabe:

       Name   Age  Score
2  Charlie  None     78
3   David   40.0     NaN
4   Emily   35.0     88
0   Alice   25.0     85
1     Bob   30.0     92

Sortieren nach einer benutzerdefinierten Reihenfolge

Sortieren basierend auf einer vordefinierten Reihenfolge

Sie können einen DataFrame basierend auf einer vordefinierten Reihenfolge von Werten in einer Spalte sortieren. Dies ist nützlich, wenn Sie eine bestimmte Reihenfolge beibehalten möchten, z.B. bei der Sortierung nach einer kategorischen Variable.

# Erstelle einen DataFrame mit kategorischen Daten
df = pd.DataFrame({'Category': ['A', 'B', 'C', 'D', 'E']})
 
# Definiere eine benutzerdefinierte Reihenfolge für die Spalte 'Category'
custom_order = ['C', 'A', 'E', 'B', 'D']
 
# Sortiere den DataFrame nach der Spalte 'Category' unter Verwendung der benutzerdefinierten Reihenfolge
sorted_df = df.sort_values(by='Category', key=lambda x: pd.Categorical(x, categories=custom_order, ordered=True))
print(sorted_df)

Ausgabe:

  Category
2       C
0       A
4       E
1       B
3       D

Nutzung des Parameters key in sort_values()

Der Parameter key in sort_values() ermöglicht es Ihnen, eine benutzerdefinierte Sortierfunktion auf die Spalte(n), nach denen Sie sortieren, anzuwenden. Dies kann nützlich sein, wenn Sie komplexe Sortieroperationen durchführen müssen.

# Sortiere den DataFrame nach der Länge der Spalte 'Name'
sorted_df = df.sort_values(by='Name', key=lambda x: x.str.len())
print(sorted_df)

Ausgabe:

     Name  Age  Score
0  Alice   25     85
1    Bob   30     92
2 Charlie   35     78
3  David   40     88

Sortieren von kategorischen Daten

Arbeiten mit kategorischen Daten in Pandas

Pandas bietet Unterstützung für die Arbeit mit kategorischen Daten, was nützlich sein kann, wenn Sie Daten sortieren. Kategorische Daten werden in Pandas als spezieller Datentyp dargestellt, der es Ihnen ermöglicht, die Reihenfolge und Bedeutung der Kategorien zu erhalten.

# Erstelle einen DataFrame mit kategorischen Daten
df = pd.DataFrame({'Category': pd.Categorical(['High', 'Low', 'Medium', 'High', 'Low'], ordered=True)})
 
# Sortiere den DataFrame nach der Spalte 'Category'
sorted_df = df.sort_values(by='Category')
print(sorted_df)

Sortieren von kategorischen Spalten

Wenn eine DataFrame nach einer kategorischen Spalte sortiert wird, behält Pandas die Reihenfolge der Kategorien bei, auch wenn die zugrunde liegenden Werte Zeichenketten sind.

# Erstellen einer DataFrame mit kategorischen Daten
df = pd.DataFrame({'Kategorie': pd.Categorical(['Hoch', 'Niedrig', 'Mittel'], ordered=True)})
 
# Sortieren der DataFrame nach der Spalte 'Kategorie'
sorted_df = df.sort_values(by='Kategorie')
print(sorted_df)

Ausgabe:

   Kategorie
1   Niedrig
2   Mittel
0   Hoch

Erhaltung der Reihenfolge der Kategorien

Wenn Sie eine spezifische Reihenfolge der Kategorien beim Sortieren beibehalten möchten, können Sie die Kategorien und ihre Reihenfolge beim Erstellen der kategorischen Daten definieren.

# Definieren der Kategorien und ihrer Reihenfolge
categories = ['Niedrig', 'Mittel', 'Hoch']
 
# Erstellen einer DataFrame mit kategorischen Daten und einer vordefinierten Reihenfolge
df = pd.DataFrame({'Kategorie': pd.Categorical(['Hoch', 'Niedrig', 'Mittel'], categories=categories, ordered=True)})
 
# Sortieren der DataFrame nach der Spalte 'Kategorie'
sorted_df = df.sort_values(by='Kategorie')
print(sorted_df)

Ausgabe:

   Kategorie
1   Niedrig
2   Mittel
0   Hoch

Sortieren von Datumsspalten

Umgang mit Datumswerten in Pandas

Pandas bietet eine ausgezeichnete Unterstützung für die Arbeit mit Datumswerten, einschließlich der Sortierung nach Datumsspalten.

#Erstellen einer DataFrame mit Datumstehen
import datetime
 
df = pd.DataFrame({'Datum': [datetime.datetime(2022, 1, 1),
                           datetime.datetime(2022, 3, 15),
                           datetime.datetime(2021, 12, 31),
                           datetime.datetime(2022, 2, 28)]})
 
#Sortieren der DataFrame nach der Spalte 'Datum'
sorted_df = df.sort_values(by='Datum')
print(sorted_df)

Ausgabe:

           Datum
2 2021-12-31 00:00:00
0 2022-01-01 00:00:00
3 2022-02-28 00:00:00
1 2022-03-15 00:00:00

Sortieren nach Datumsspalten

Sie können eine DataFrame nach einer oder mehreren Datumsspalten mit der Methode sort_values() sortieren.

# Erstellen einer DataFrame mit mehreren Datumsspalten
df = pd.DataFrame({'Datum': [datetime.datetime(2022, 1, 1),
                           datetime.datetime(2022, 3, 15),
                           datetime.datetime(2021, 12, 31),
                           datetime.datetime(2022, 2, 28)],
                   'Zeit': [datetime.time(10, 30),
                           datetime.time(15, 45),
                           datetime.time(9, 0),
                           datetime.time(12, 0)]})
 
# Sortieren der DataFrame nach 'Datum' und 'Zeit'
sorted_df = df.sort_values(by=['Datum', 'Zeit'])
print(sorted_df)

Ausgabe:

           Datum     Zeit
2 2021-12-31 00:00:00  09:00:00
0 2022-01-01 00:00:00  10:30:00
3 2022-02-28 00:00:00  12:00:00
1 2022-03-15 00:00:00  15:45:00

Sortieren nach Datumskomponenten

Sie können eine DataFrame auch nach einzelnen Datumskomponenten wie Jahr, Monat, Tag, Stunde, Minute und Sekunde sortieren.

# Sortieren der DataFrame nach dem Jahr der Spalte 'Datum'
sorted_df = df.sort_values(by=pd.to_datetime(df['Datum']).dt.year)
print(sorted_df)

Ausgabe:

           Datum     Zeit
2 2021-12-31 00:00:00  09:00:00
0 2022-01-01 00:00:00  10:30:00
3 2022-02-28 00:00:00  12:00:00
1 2022-03-15 00:00:00  15:45:00

Effiziente Sortiertechniken

Optimierung der Sortierleistung

Das Sortieren großer Datenrahmen kann rechenintensiv sein, daher ist es wichtig, die Leistung beim Sortieren von Daten zu beachten. Pandas bietet mehrere Optionen, um die Sortierleistung zu optimieren.

# Das DataFrame inplace sortieren, um das Erstellen eines neuen DataFrames zu vermeiden
df.sort_values(by='Alter', inplace=True)

Verwendung des Parameters inplace

Der Parameter inplace in sort_values() ermöglicht es Ihnen, den ursprünglichen DataFrame direkt zu ändern, anstatt einen neuen DataFrame zu erstellen. Dadurch kann Speicherplatz gespart werden, insbesondere bei der Arbeit mit großen Datensätzen.

# Das DataFrame inplace sortieren, um das Erstellen eines neuen DataFrames zu vermeiden
df.sort_values(by='Alter', inplace=True)

Nutzung des Parameters ignore_index

Der Parameter ignore_index in sort_values() kann verwendet werden, um den ursprünglichen Index des DataFrames nach dem Sortieren zu verwerfen. Dies kann nützlich sein, wenn der ursprüngliche Index nicht beibehalten werden muss und Speicherplatz gespart werden soll.

# Das DataFrame sortieren und den ursprünglichen Index verwerfen
sorted_df = df.sort_values(by='Alter', ignore_index=True)

Sortieren mit mehrstufigen Indizes

Arbeiten mit mehrstufigen Indizes in Pandas

Pandas unterstützt mehrstufige (hierarchische) Indizes, die beim Sortieren von Daten nützlich sein können. Mehrstufige Indizes ermöglichen es Ihnen, Daten in einer komplexeren Struktur zu organisieren.

Python-Tutorial (Teil 2)

Funktionen

Funktionen sind ein grundlegendes Konzept in Python. Sie ermöglichen es Ihnen, eine Reihe von Anweisungen zu kapseln und sie in Ihrem Code wiederzuverwenden. Hier ist ein Beispiel für eine einfache Funktion, die die Fläche eines Rechtecks berechnet:

def berechne_flaeche(laenge, breite):
    flaeche = laenge * breite
    return flaeche
 
# Aufruf der Funktion
rechteck_flaeche = berechne_flaeche(5, 10)
print(rechteck_flaeche)  # Ausgabe: 50

In diesem Beispiel nimmt die Funktion berechne_flaeche zwei Parameter laenge und breite entgegen und liefert die berechnete Fläche zurück. Sie können diese Funktion dann mit verschiedenen Werten aufrufen, um die Fläche verschiedener Rechtecke zu erhalten.

Funktionen können auch Standardparameterwerte und eine variable Anzahl von Argumenten haben:

def begruesse(name, nachricht="Hallo"):
    print(f"{nachricht}, {name}!")
 
begruesse("Alice")  # Ausgabe: Hallo, Alice!
begruesse("Bob", "Hi")  # Ausgabe: Hi, Bob!
 
def summiere_zahlen(*args):
    summe = 0
    for zahl in args:
        summe += zahl
    return summe
 
print(summiere_zahlen(1, 2, 3))  # Ausgabe: 6
print(summiere_zahlen(4, 5, 6, 7, 8))  # Ausgabe: 30

Im ersten Beispiel hat die Funktion begruesse einen Standardwert für den Parameter nachricht. Im zweiten Beispiel kann die Funktion summiere_zahlen eine beliebige Anzahl von Argumenten aufnehmen, die dann addiert werden.

## Module und Pakete

Die Python-Standardbibliothek bietet eine Vielzahl von integrierten Modulen, die Sie in Ihren Programmen verwenden können. Sie können auch eigene Module und Pakete erstellen, um Ihren Code zu organisieren.

Hier ist ein Beispiel für die Verwendung des `math`-Moduls:

```python
import math

print(math.pi)  # Ausgabe: 3.141592653589793
print(math.sqrt(16))  # Ausgabe: 4.0

Sie können auch spezifische Funktionen oder Attribute aus einem Modul importieren:

from math import pi, sqrt
 
print(pi)  # Ausgabe: 3.141592653589793
print(sqrt(16))  # Ausgabe: 4.0

Um Ihr eigenes Modul zu erstellen, können Sie einfach eine Python-Datei mit der Erweiterung .py speichern. Erstellen wir zum Beispiel ein Modul namens my_module.py:

def greet(name):
    print(f"Hallo, {name}!")
 
def calculate_area(length, width):
    return length * width

Sie können dann die Funktionen aus diesem Modul in Ihrem Hauptskript importieren und verwenden:

import my_module
 
my_module.greet("Alice")  # Ausgabe: Hallo, Alice!
area = my_module.calculate_area(5, 10)
print(area)  # Ausgabe: 50

Pakete sind eine Möglichkeit, Ihre Module in eine hierarchische Struktur zu organisieren. Um ein Paket zu erstellen, müssen Sie einen Ordner mit einer __init__.py-Datei erstellen. Hier ist ein Beispiel:

my_package/
    __init__.py
    utils/
        __init__.py
        math_functions.py
        string_functions.py
    data/
        __init__.py
        database.py

In diesem Beispiel ist my_package das Paket und enthält zwei Unterpakete: utils und data. Jedes Unterpaket hat eine __init__.py-Datei, die zur Definition von paketweiter Funktionalität verwendet werden kann.

Sie können dann die Funktionen aus den Untermodulen wie folgt importieren und verwenden:

from my_package.utils.math_functions import calculate_area
from my_package.data.database import connect_to_db
 
area = calculate_area(5, 10)
db_connection = connect_to_db()

Objektorientierte Programmierung (OOP)

Python unterstützt objektorientierte Programmierung, die es Ihnen ermöglicht, benutzerdefinierte Klassen und Objekte zu erstellen. Hier ist ein Beispiel für eine einfache Dog-Klasse:

class Dog:
    def __init__(self, name, breed):
        self.name = name
        self.breed = breed
 
    def bark(self):
        print("Woof!")
 
# Objekte erstellen
my_dog = Dog("Buddy", "Labrador")
print(my_dog.name)  # Ausgabe: Buddy
print(my_dog.breed)  # Ausgabe: Labrador
my_dog.bark()  # Ausgabe: Woof!

In diesem Beispiel hat die Dog-Klasse eine __init__-Methode, die eine spezielle Methode ist, die verwendet wird, um die Attribute des Objekts zu initialisieren. Die bark-Methode ist eine benutzerdefinierte Methode, die auf einem Dog-Objekt aufgerufen werden kann.

Sie können auch Vererbungsbeziehungen zwischen Klassen erstellen:

class GuideDog(Dog):
    def __init__(self, name, breed, training_level):
        super().__init__(name, breed)
        self.training_level = training_level
 
    def guide(self):
        print("Ich führe meinen Besitzer!")
 
guide_dog = GuideDog("Buddy", "Labrador", "fortgeschritten")
guide_dog.bark()  # Ausgabe: Woof!
guide_dog.guide()  # Ausgabe: Ich führe meinen Besitzer!

In diesem Beispiel erbt die GuideDog-Klasse von der Dog-Klasse und fügt ein training_level-Attribut und eine guide-Methode hinzu.

Ausnahmen und Fehlerbehandlung

Python bietet einen robusten Mechanismus zur Ausnahmebehandlung, um Laufzeitfehler zu behandeln. Hier ist ein Beispiel für die Behandlung eines ZeroDivisionError:

def divide(a, b):
    try:
        result = a / b
        return result
    except ZeroDivisionError:
        print("Fehler: Division durch Null.")
        return None
 
print(divide(10, 2))  # Ausgabe: 5.0
print(divide(10, 0))  # Ausgabe: Fehler: Division durch Null.

In diesem Beispiel verwendet die Funktion divide einen try-except-Block, um den ZeroDivisionError abzufangen und elegant damit umzugehen.

Sie können auch Ihre eigenen benutzerdefinierten Ausnahmen erstellen:

class InvalidInputError(Exception):
    pass
 
def calculate_area(length, width):
    if length <= 0 or width <= 0:
        raise InvalidInputError("Länge und Breite müssen positive Zahlen sein.")
    return length * width
 
try:
    area = calculate_area(5, 10)
    print(area)  # Ausgabe: 50
    area = calculate_area(-5, 10)
except InvalidInputError as e:
    print(e)  # Ausgabe: Länge und Breite müssen positive Zahlen sein.

In diesem Beispiel löst die Funktion calculate_area eine benutzerdefinierte InvalidInputError-Ausnahme aus, wenn die Eingabewerte ungültig sind. Der try-except-Block fängt diese Ausnahme ab und behandelt sie.

Fazit

In diesem Tutorial haben Sie wichtige Konzepte in Python kennengelernt, darunter Funktionen, Module und Pakete, objektorientierte Programmierung und Fehlerbehandlung. Diese Themen sind wesentlich für den Aufbau komplexerer und robuster Python-Anwendungen. Vergessen Sie nicht, mit den bereitgestellten Codebeispielen zu üben und zu experimentieren, um Ihr Verständnis zu festigen. Viel Spaß beim Programmieren!

MoeNagy Dev