Fonction Pandas pd.qcut()
pd.qcut()est une fonction de la bibliothèque Pandas utilisée pourdiscrétisation par quantiles. Elle divise les données en un nombre égal d'échantillons, chaque classe contenant approximativement le même nombre de points de données.
etpd.cut()Contrairement à (la discrétisation à largeur égale),pd.qcut()elle garantit que chaque intervalle contient une quantité égale de données, ce qui la rend très adaptée au traitement de distributions asymétriques ou de cas où les données doivent être divisées selon leurs quantiles naturels.
Significations des mots: qcutDans ce nom, "q" représente "quantile" (Dividebitsnumber), ce qui signifie « découper » les données par quantiles.
Syntaxe de base et paramètres
pd.qcut()C'est une fonction de premier niveau de la bibliothèque Pandas, utilisée pour la discrétisation basée sur les quantiles.
Format de syntaxe
pd.qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise')
Description du paramètre
- Paramètre:
x- Type : Objet de type tableau, tel qu'une liste, une Series, un array, etc.
- Description : Données numériques continues à discrétiser.
- Paramètre:
q- Type : Entier ou tableau de quantiles.
- Description : Le nombre de classes ou les quantiles spécifiques. S'il s'agit d'un entier n, cela signifie diviser les données en n groupes de taille égale (chaque groupe contient environ 1/n des données). Cela peut aussi être un tableau de quantiles (par exemple, [0, 0.25, 0.5, 0.75, 1.0]).
- Paramètre:
labels- Type : tableau ou None.
- Description : Spécifiez des étiquettes personnalisées pour chaque intervalle. Si elles ne sont pas spécifiées, la notation des quantiles (telle que "(0, 25]") est utilisée.
- Paramètre:
retbins- Type : valeur booléenne.
- Description : Si
True, le résultat renvoyé inclut les valeurs limites des classes. La valeur par défaut estFalse。
- Paramètre:
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'。
Description de la fonction
- Valeur de retour: Renvoie une Series de type Categorical, chaque valeur correspondant à son groupe de quantiles.
- Effet: Transforme les valeurs continues en catégories discrètes par quantiles, chaque catégorie contenant approximativement le même nombre d'échantillons.
Exemples
Maîtrisons à fond, à travers une série d'exemples du plus simple au plus complexe,pd.qcut()l'utilisation de.
Exemple 1 : Utilisation de base - Discrétisation par quartile
Exemple
import numpy as np
# 1. Créer des données numériques asymétriques (la plupart des valeurs sont petites)
np.random.seed(42)
data = np.random.exponential(scale=2, size=100) # Données de distribution exponentielle
# Prendre un sous-ensemble des données pour la lisibilité
scores = pd.Series(data[:20])
print("=== Données originales ===")
print(scores.sort_values().values)
# 2. Utiliser pd.qcut() pour diviser les données en 4 groupes de quantiles (quartile)
result = pd.qcut(scores, q=4)
print("\n=== pd.qcut(scores, q=4) discrétisation par quartile ===)
print(result.value_counts().sort_index())
Sortie attendue :
=== 原始数据 === [ 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
Explication du code :
- Pour des données distribuées exponentiellement, si une discrétisation à largeur égale est utilisée, la plupart des données se concentreront dans une seule classe.
pd.qcut()Cela garantit que chaque classe contient approximativement le même nombre d'échantillons (ici 5, exactement 20/4).- Les points de quantiles sont calculés à partir de la distribution réelle des données, plutôt que d'être répartis uniformément.
Exemple 2 : Spécification de quantiles personnalisés
Grâce à laqparamètre, vous pouvez spécifier des quantiles arbitraires, tels que les déciles, les percentiles, etc.
Exemple
import numpy as np
# 1. Créer les données
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("=== Données de scores des étudiants ===")
print(df)
# 2. Discrétiser selon des quantiles personnalisés [0, 0.3, 0.7, 1.0] représentant 30%, 70%, 100%
result = pd.qcut(df['score'], q=[0, 0.3, 0.7, 1.0])
print("\n=== Discrétisation par quantiles de 30% et 70% ===)
print(result)
# 3. Ajouter des étiquettes personnalisées
labels = ['Réussi', 'Bien', 'Excellent']
result_labeled = pd.qcut(df['score'], q=3, labels=labels)
print("\n=== Étiquettes personnalisées ajoutées ===)
print(result_labeled)
Sortie attendue :
=== 学生成绩数据 ===
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]
Explication du code :
q=[0, 0.3, 0.7, 1.0]Trois intervalles sont définis : 0-30% (scores faibles), 30%-70% (moyens), et 70%-100% (scores élevés).- En utilisant la
labelsparamètre, vous pouvez nommer chaque intervalle au lieu d'utiliser la notation d'intervalle par défaut.
Exemple 3 : Comparaison entre cut et qcut
Grâce à la comparaison, vous pouvez mieux comprendrecutetqcutla différence.
Exemple
import numpy as np
# 1. Créer des données asymétriques (la plupart des valeurs sont petites)
data = pd.Series([1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 20, 30, 40, 50])
print("=== Données originales ===")
print(data.values)
# 2. Discrétisation à largeur égale (pd.cut)
print("\n=== pd.cut discrétisation à largeur égale ===)
cut_result = pd.cut(data, bins=4)
print(cut_result.value_counts().sort_index())
# 3. Discrétisation à fréquence égale (pd.qcut)
print("\n=== pd.qcut discrétisation à fréquence égale ===)
qcut_result = pd.qcut(data, q=4)
print(qcut_result.value_counts().sort_index())
Sortie attendue :
=== 原始数据 === [ 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 的数据
Explication du code :
pd.cut()La plage de données est divisée uniformément en 4 parties, mais comme les données sont fortement asymétriques, la plupart des valeurs (neuf 1) tombent dans le premier intervalle.pd.qcut()Cela garantit que chaque intervalle contient le même nombre de points de données (4), même si les largeurs des intervalles diffèrent grandement.
Autres extensionsAstuce :
pd.cut()Convient aux cas où la distribution des données est uniforme ou lorsque des intervalles de largeur fixe sont nécessaires.pd.qcut()Convient aux cas où la distribution des données est inégale ou lorsqu'une division par rang/pourcentage est requise.
Fonctions courantes de Pandas