Pandas pd.qcut() Funktion

Pandas 通用函数Pandas Häufige Funktionen


pd.qcut()ist eine Funktion in der Pandas-Bibliothek, die fürBinning nach Quantilenverwendet wird. Sie teilt Daten in eine gleiche Anzahl von Stichproben auf, wobei jedes Bin ungefähr die gleiche Anzahl von Datenpunkten enthält.

undpd.cut()Im Gegensatz zum (Binning mit gleicher Breite),pd.qcut()sie stellt sicher, dass jedes Intervall die gleiche Datenmenge enthält, was sie sehr geeignet für den Umgang mit schiefen Verteilungen oder Fällen macht, in denen Daten nach ihren natürlichen Quantilen aufgeteilt werden müssen.

Wortbedeutungen: qcutDarin steht "q" für "quantile" (Dividebitsnumber), was bedeutet, Daten nach Quantilen zu "schneiden".


Grundlegende Syntax und Parameter

pd.qcut()Es ist eine Top-Level-Funktion der Pandas-Bibliothek, die für die Diskretisierung auf Basis von Quantilen verwendet wird.

Syntaxformat

pd.qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise')

Parameterbeschreibung

  • Parameter: x
    • Typ: Array-ähnliches Objekt, wie eine Liste, Series, ein Array usw.
    • Beschreibung: Kontinuierliche numerische Daten, die in Bins eingeteilt werden sollen.
  • Parameter: q
    • Typ: Integer oder Quantil-Array.
    • Beschreibung: Die Anzahl der Bins oder die spezifischen Quantile. Wenn es eine ganze Zahl n ist, bedeutet dies, die Daten in n gleich große Gruppen aufzuteilen (jede Gruppe enthält etwa 1/n der Daten). Es kann auch ein Array von Quantilen sein (z. B. [0, 0.25, 0.5, 0.75, 1.0]).
  • Parameter: labels
    • Typ: Array oder None.
    • Beschreibung: Benutzerdefinierte Labels für jedes Intervall angeben. Wenn nicht angegeben, wird die Quantilsnotation (wie "(0, 25]") verwendet.
  • Parameter: retbins
    • Typ: Boolescher Wert.
    • Beschreibung: WennTrue, enthält das zurückgegebene Ergebnis die Bin-Grenzwerte. Standard istFalse。
  • Parameter: duplicates
    • Type: String ('raise' or 'drop').
    • Description: If the bin edges have duplicates (resulting in fewer intervals than the specified q value),'raise'raises an exception,'drop'deletes duplicate edges. Default is'raise'。

Funktionsbeschreibung

  • Rückgabewert: Gibt eine Series vom Typ Categorical zurück, wobei jeder Wert seiner Quantilgruppe entspricht.
  • Effekt: Ordnet kontinuierliche Werte anhand von Quantilen diskreten Kategorien zu, wobei jede Kategorie ungefähr die gleiche Anzahl an Stichproben enthält.

Beispiele

Lassen Sie uns durch eine Reihe von Beispielen von einfach bis komplex gründlich meistern,pd.qcut()die Verwendung von.

Beispiel 1: Grundlegende Verwendung – Binning nach Quartilen

Beispiel

import pandas as pd
import numpy as np

# 1. Erzeuge schiefe numerische Daten (die meisten Werte sind klein)
np.random.seed(42)
data = np.random.exponential(scale=2, size=100)  # Daten mit Exponentialverteilung

# Nimm eine Teilmenge der Daten zur besseren Lesbarkeit
scores = pd.Series(data[:20])

print("=== Originaldaten ===")
print(scores.sort_values().values)

# 2. Verwende pd.qcut(), um die Daten in 4 Quantilgruppen (Quartile) zu unterteilen
result = pd.qcut(scores, q=4)
print("\n=== pd.qcut(scores, q=4) Quartil-Binning ===)
print(result.value_counts().sort_index())

Erwartete Ausgabe:

=== 原始数据 ===
[ 0.078  0.29   0.68   0.91   1.03  1.06  1.23  1.3   1.5   1.69
  1.86  2.01  2.12  2.3   2.32  2.42  3.03  3.39  5.29  7.39]

=== pd.qcut(scores, q=4) 四分位分箱 ===
(0.0783, 1.547]     5
(1.547, 2.315]     5
(2.315, 3.151]     5
(3.151, 7.393]     5
dtype: int64

Code-Erklärung:

  1. Bei exponentialverteilten Daten konzentrieren sich die meisten Daten in einem Bin, wenn ein gleichbreites Binning verwendet wird.
  2. pd.qcut()Es stellt sicher, dass jeder Bin ungefähr die gleiche Anzahl von Stichproben enthält (hier 5, genau 20/4).
  3. Die Quantilpunkte werden auf Grundlage der tatsächlichen Verteilung der Daten berechnet, anstatt gleichmäßig aufgeteilt zu werden.

Beispiel 2: Benutzerdefinierte Quantile angeben

Durch dieqMit dem Parameter können Sie beliebige Quantile angeben, wie Dezile, Perzentile usw.

Beispiel

import pandas as pd
import numpy as np

# 1. Daten erstellen
df = pd.DataFrame({
    'name': ['Student_' + str(i) for i in range(1, 11)],
    'score': [65, 78, 82, 55, 90, 72, 68, 85, 45, 95]
})

print("=== Student score data ===")
print(df)

# 2. Binning nach benutzerdefinierten Quantilen [0, 0.3, 0.7, 1.0], die 30%, 70%, 100% darstellen
result = pd.qcut(df['score'], q=[0, 0.3, 0.7, 1.0])
print("\n=== Binning by 30% and 70% quantiles ===)
print(result)

# 3. Benutzerdefinierte Labels hinzufügen
labels = ['Pass', 'Good', 'Excellent']
result_labeled = pd.qcut(df['score'], q=3, labels=labels)
print("\n=== Benutzerdefinierte Labels hinzugefügt ===)
print(result_labeled)

Erwartete Ausgabe:

=== 学生成绩数据 ===
      name  score
0  Student_1     65
1  Student_2     78
2  Student_3     82
3  Student_4     55
4  Student_5     90
5  Student_6     72
6  Student_7     68
7  Student_8     85
8  Student_9     45
9  Student_10    95

=== 按 30% 和 70% 分位数分箱 ===
0      (44.999, 65.8]
1      (65.8, 86.4]
2      (65.8, 86.4]
3      (44.999, 65.8]
4      (86.4, 95.0]
5      (65.8, 86. 86.4]
6      (0.0, 44.999]
7      (44.999, 65.8]
8      (0.0, 44.999]
9      (65.8, 86.4]
10     (65.8, 86.4]

Code-Erklärung:

  • q=[0, 0.3, 0.7, 1.0]Es werden drei Intervalle definiert: 0-30% (niedrige Werte), 30%-70% (mittlere Werte) und 70%-100% (hohe Werte).
  • Mit derlabelsParameter können Sie jedes Intervall benennen, anstatt die Standard-Intervallnotation zu verwenden.

Beispiel 3: Vergleich von cut vs. qcut

Durch den Vergleich können Sie deutlicher verstehencutundqcutden Unterschied.

Beispiel

import pandas as pd
import numpy as np

# 1. Schiefe Daten erzeugen (die meisten Werte sind klein)
data = pd.Series([1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 20, 30, 40, 50])

print("=== Originaldaten ===")
print(data.values)

# 2. Binning mit gleicher Breite (pd.cut)
print("\n=== pd.cut Binning mit gleicher Breite ===)
cut_result = pd.cut(data, bins=4)
print(cut_result.value_counts().sort_index())

# 3. Äquifrequentes Binning (pd.qcut)
print("\n=== pd.qcut äquifrequentes Binning ===)
qcut_result = pd.qcut(data, q=4)
print(qcut_result.value_counts().sort_index())

Erwartete Ausgabe:

=== 原始数据 ===
[ 1  1  1  1  1  1  1  1  1 10 20 30 40 50]

=== pd.cut 等宽分箱 ===
(0.975, 13.25]    10   # 10 个值在这个区间
(13.25, 25.5]      1
(25.5, 37.75]      1
(37.75, 50.0]      2   # 2 个值在这个区间
dtype: 50

=== pd.qcut 等量分箱 ===
(0.999, 7.75]      4   # 约 1/4 的数据
(7.75, 25.0]       4
(25.0, 42.5]       4
(10.0, 50.0]       4   # 约 1/4 的数据

Code-Erklärung:

  • pd.cut()Der Datenbereich wird gleichmäßig in 4 Teile aufgeteilt, aber weil die Daten stark schief verteilt sind, fallen die meisten Werte (neun Einsen) in das erste Intervall.
  • pd.qcut()Es stellt sicher, dass jedes Intervall die gleiche Anzahl an Datenpunkten (4) enthält, selbst wenn die Intervallbreiten stark voneinander abweichen.

Tipp: pd.cut()Geeignet für Fälle, in denen die Datenverteilung gleichmäßig ist oder Intervalle mit fester Breite benötigt werden.pd.qcut()Geeignet für Fälle, in denen die Datenverteilung ungleichmäßig ist oder eine Einteilung nach Rang/Prozentsatz erforderlich ist.

Pandas 常用函数Pandas Häufige Funktionen

Andere Erweiterungen