HOWTO · Pandas

Pandas cut() vs qcut() Funktionen

In diesem Artikel werden wir diskutieren, was die cut()- und qcut()-Funktionen von Pandas sind. Grundsätzlich sind Pandas cut und qcut Funktionen zum Binning von Daten in Python.

Auf dieser Seite

Binning, auch Bucketing oder Diskretisierung genannt, wandelt kontinuierliche numerische Daten für die Analyse in Kategorien um. In pandas ordnet cut() Werte Intervallen zu, die durch einen Zahlenbereich festgelegt sind. qcut() berechnet die Intervallgrenzen dagegen anhand von Quantilen, sodass die Gruppen tendenziell eine ähnliche Anzahl von Beobachtungen enthalten. Welche Funktion passt, hängt davon ab, ob die Intervallwerte oder die Gruppengrößen wichtiger sind.

Was cut() und qcut() bewirken

Beide Funktionen geben kategoriale Daten zurück, deren Kategorien Intervalle beschreiben. Sie sortieren die ursprünglichen Beobachtungen nicht um: Jeder Wert behält seine Position und erhält die Kategorie des Intervalls, zu dem er gehört.

Bei cut() gibt ein ganzzahliger Wert für bins die Anzahl gleich breiter Intervalle über den Datenbereich an. Eine Folge wie [0, 10, 40, 50] legt stattdessen die genauen Grenzen fest und erzeugt damit drei Intervalle. Standardmäßig sind die Intervalle rechtsgeschlossen: Sie schließen den rechten Endpunkt ein und den linken aus. So enthält (0, 10] den Wert 10, aber nicht 0. Mit right=False erhältst du links geschlossene Intervalle wie [0, 10). Bei ausdrücklich angegebenen Grenzen erhalten Werte außerhalb der ersten und letzten Grenze eine fehlende Kategorie.

Mit qcut() forderst du mit q=4 vier Quantilgruppen (Quartile) an. Die Funktion bestimmt die Grenzen anhand der Datenverteilung statt anhand einer festen Intervallbreite. Bei vielen gleichen Werten sind gleich große Gruppen möglicherweise nicht erreichbar; wiederholte Quantilgrenzen können außerdem verhindern, dass die gewünschte Anzahl unterschiedlicher Intervalle entsteht. Prüfe in diesem Fall die Daten und reduziere entweder die Zahl der Quantile oder verwende duplicates="drop". Dadurch können weniger Intervalle als angefordert entstehen.

Gleich breite Intervalle mit cut() erstellen

Übergib eine ganze Zahl, um den beobachteten Wertebereich in gleich breite Intervalle zu teilen. Du kannst auch konkrete Grenzen übergeben, wenn die Schnittpunkte eine klare Bedeutung haben, etwa Notenstufen oder feste Preisspannen. Gleich breite Intervalle bedeuten nicht, dass sie gleich viele Werte enthalten: In einem dicht belegten Bereich können viele Beobachtungen liegen, in einem dünn belegten nur wenige. Wenn du konkrete Grenzen vorgibst, prüfe, ob sie alle Werte abdecken, die du kategorisieren möchtest.

Quantilbasierte Intervalle mit qcut() erstellen

Verwende qcut(), wenn die Analyse Gruppen mit ungefähr gleich vielen Beobachtungen erfordert, beispielsweise Quartile zum Vergleichen des unteren und oberen Teils einer Verteilung. Die numerische Breite der Intervalle richtet sich dabei nach den Daten. Gleiche Werte können zu unterschiedlichen Gruppengrößen führen, und doppelte Quantilgrenzen können die Zahl der nutzbaren Kategorien verringern. Das folgende Beispiel verwendet eine kleine, reproduzierbare Zahlenreihe und zeigt automatische gleich breite Intervalle, ausdrücklich festgelegte Grenzen für cut() sowie Quantilintervalle.

Führe dieses Beispiel aus. Die Bezeichnungen und Ausgaben im unveränderten Beispielcode bleiben auf Englisch.

import pandas as pd

values = pd.Series([1, 2, 3, 4, 5, 6, 7, 8], name="value")

width_bins = pd.cut(values, bins=4)
fixed_bins = pd.cut(values, bins=[0, 4, 8])
quantile_bins = pd.qcut(values, q=4)

print("Equal-width cut counts:")
print(width_bins.value_counts().sort_index())
print("\nExplicit-edge cut counts:")
print(fixed_bins.value_counts().sort_index())
print("\nQuantile qcut counts:")
print(quantile_bins.value_counts().sort_index())
Equal-width cut counts:
value
(0.993, 2.75]    2
(2.75, 4.5]      2
(4.5, 6.25]      2
(6.25, 8.0]      2
Name: count, dtype: int64

Explicit-edge cut counts:
value
(0, 4]    4
(4, 8]    4
Name: count, dtype: int64

Quantile qcut counts:
value
(0.999, 2.75]    2
(2.75, 4.5]      2
(4.5, 6.25]      2
(6.25, 8.0]      2
Name: count, dtype: int64

Die Ausgabe zeigt vier gleich breite Intervalle mit jeweils zwei Werten, zwei ausdrücklich festgelegte Intervalle mit jeweils vier Werten und vier Quantilintervalle mit jeweils zwei Werten. Bei der standardmäßigen rechtsgeschlossenen Schreibweise gehört 4 zu (0, 4] und 8 zu (4, 8]. In dieser gleichmäßig verteilten Stichprobe stimmen die Quantilgrenzen zufällig mit den Grenzen der gleich breiten Intervalle überein. Bei gleichen Werten können Quantilgruppen unterschiedlich viele Werte enthalten; doppelte Grenzen können außerdem die Zahl der Intervalle verringern.

cut() und qcut() im Vergleich

Wähle cut(), wenn die Intervallgrenzen über Datensätze oder Berichtszeiträume hinweg fest und gut interpretierbar bleiben sollen. Wähle qcut(), wenn es auf den relativen Rang oder ähnlich große Gruppen ankommt und sich die numerischen Grenzen mit den Daten ändern dürfen. Für zeitliche Vergleiche sorgen feste Grenzen von cut() dafür, dass die Kategorien dieselbe Bedeutung behalten. Werden die Grenzen von qcut() für jeden Zeitraum neu berechnet, können die Kategorien jeweils andere Zahlenbereiche darstellen.

Bevor du dich auf die Kategorien verlässt, prüfe ihre Intervallbezeichnungen und Häufigkeiten. Bei ausdrücklich festgelegten Grenzen für cut() solltest du bestätigen, dass die Endpunkte die vorgesehenen Werte abdecken, und entscheiden, ob links- oder rechtsgeschlossene Intervalle zur Regel passen. Prüfe bei qcut() auf gleiche Werte und stelle fest, wie viele unterschiedliche Intervalle entstanden sind, falls doppelte Grenzen verworfen werden. Keine der beiden Funktionen garantiert in jeder Situation gleich große Gruppen: cut() steuert die Intervallbreiten, während qcut() mithilfe von Quantilen auf ähnliche Gruppengrößen zielt.