Pandas pd.qcut() Funktion
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: Wenn
True, 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 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:
- Bei exponentialverteilten Daten konzentrieren sich die meisten Daten in einem Bin, wenn ein gleichbreites Binning verwendet wird.
pd.qcut()Es stellt sicher, dass jeder Bin ungefähr die gleiche Anzahl von Stichproben enthält (hier 5, genau 20/4).- 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 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 der
labelsParameter 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 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.
Andere ErweiterungenTipp:
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 Häufige Funktionen