Fonction Pandas pd.crosstab()
pd.crosstab()est utilisée dans la bibliothèque Pandas pourcalculer la tabulation croiséefonction. Elle peut calculer la fréquence ou les statistiques agrégées de deux ou plusieurs variables et générer un tableau similaire à un tableau croisé dynamique Excel.
La tabulation croisée est un outil très utile en analyse statistique, souvent utilisé pour analyser la relation entre deux ou plusieurs variables catégorielles, comme compter le nombre d'employés masculins et féminins dans différents services.
Signification du mot: crosstabest l'abréviation de « tabulation croisée », un tableau statistique qui affiche la distribution conjointe de deux ou plusieurs variables.
Syntaxe de base et paramètres
pd.crosstab()est une fonction de haut niveau de la bibliothèque Pandas, utilisée pour calculer des tabulations croisées.
Format de syntaxe
pd.crosstab(index, columns, values=None, aggfunc=None, margins=False, margins_name='All', dropna=True, normalize=False)
Description du paramètre
- Paramètre:
index- Type : array-like, Series, ou list.
- Description : Données utilisées comme index de ligne. Peut être une seule colonne ou plusieurs colonnes (liste).
- Paramètre:
columns- Type : array-like, Series, ou list.
- Description : Données utilisées comme index de colonne. Peut être une seule colonne ou plusieurs colonnes (liste).
- Paramètre:
values- Type : array-like ou None.
- Description : Valeurs à agréger. Si spécifié, il doit être utilisé avec
aggfuncparamètre.
- Paramètre:
aggfunc- Type : fonction ou chaîne.
- Description : Fonction d'agrégation (telle que 'sum', 'mean', 'count', etc.). Lorsqu'elle est spécifiée
valuesson utilisation est requise.
- Paramètre:
margins- Type : booléen.
- Description : Si
True, ajouter les totaux de ligne et de colonne. La valeur par défaut estFalse。
- Paramètre:
normalize- Type : booléen ou 'all', 'index', 'columns'.
- Description : Si
True, diviser les valeurs par le total pour générer des proportions (0-1). Vous pouvez également spécifier 'index' ou 'columns' pour normaliser par ligne ou par colonne.
Description de la fonction
- Valeur de retour: Renvoie un DataFrame représentant la relation croisée entre deux ou plusieurs variables.
- Effet: Génère un tableau où les lignes et les colonnes représentent différentes variables catégorielles, et les cellules affichent la fréquence ou la valeur agrégée correspondante.
Exemples
Maîtrisons à fond à travers une série d'exemples, du simple au complexepd.crosstab()utilisation de.
Exemple 1 : Utilisation de base - Tabulation croisée de deux variables catégorielles
Exemples
# 1. Créer les données des employés
employees = pd.DataFrame({
'department': ['Ventes', 'Ventes', 'Ventes', 'Ingénierie', 'Ingénierie', 'RH', 'RH', 'Ventes', 'Ingénierie', 'RH'],
'gender': ['Homme', 'Femme', 'Femme', 'Homme', 'Homme', 'Femme', 'Homme', 'Femme', 'Femme', 'Homme']
})
print("=== Données des employés ===")
print(employees)
# 2. Calculer le tableau croisé du département et du genre (fréquence)
result = pd.crosstab(employees['department'], employees['gender'])
print("n=== pd.crosstab() Tabulation croisée du département et du genre ===")
print(result)
Sortie attendue :
=== 员工数据 === department gender 0 Sales Male 1 Sales Female 2 Sales Female 3 Engineering Male 4 Engineering Male 5 HR Female 6 HR Male 7 Sales Female 8 Engineering Female 9 HR Male === pd.crosstab() 部门与性别交叉表 === gender Female Male department Engineering 1 2 HR 1 2 Sales 3 1
Explication du code :
- Le tableau résultant affiche le nombre d'employés hommes et femmes dans chaque département.
Exemple 2 : Ajout des totaux de ligne/colonne et normalisation
Utilisermarginsparamètre pour ajouter les totaux,normalizeparamètre pour afficher la distribution des proportions.
Exemples
# Utiliser les données sur les employés ci-dessus
employees = pd.DataFrame({
'department': ['Ventes', 'Ventes', 'Ventes', 'Ingénierie', 'Ingénierie', 'RH', 'RH', 'Ventes', 'Ingénierie', 'RH'],
'gender': ['Homme', 'Femme', 'Femme', 'Homme', 'Homme', 'Femme', 'Homme', 'Femme', 'Femme', 'Homme']
})
# 1. Ajouter les totaux de ligne et de colonne
result_margins = pd.crosstab(employees['department'], employees['gender'], margins=True)
print("=== Ajout des totaux (margins=True) ===")
print(result_margins)
# 2. Normalisation - convertir en proportions
print("n=== Normalisation globale (normalize=True) ===")
result_norm = pd.crosstab(employees['department'], employees['gender'], normalize=True)
print(result_norm.round(3))
# 3. Normaliser par ligne (la somme de chaque ligne est égale à 1)
print("n=== Normaliser par ligne (normalize='index') ===")
result_norm_index = pd.crosstab(employees['department'], employees['gender'], normalize='index')
print(result_norm_index.round(3))
# 4. Normaliser par colonne (la somme de chaque colonne est égale à 1)
print("n=== Normaliser par colonne (normalize='columns') ===")
result_norm_col = pd.crosstab(employees['department'], employees['gender'], normalize='columns')
print(result_norm_col.round(3))
Sortie attendue :
=== 添加合计 (margins=True) === gender Female Male All department Engineering 1 2 3 HR 1 2 3 Sales 3 1 4 All 5 5 10 === 整体归一化 (normalize=True) === gender Female Male department Engineering 0.1 0.2 HR 0.1 0.2 Sales 0.3 0.1 === 按行归一化 (normalize='index') === gender Female Male department Engineering 0.333 0.667 HR 0.333 0.667 Sales 0.75 0.25 === 按列归一化 (normalize='columns') === gender Female Male department Engineering 0.2 0.4 HR 0.2 0.4 Sales 0.6 0.2
Explication du code :
- La normalisation facilite l'analyse des relations proportionnelles et la compréhension de la répartition relative du genre au sein de chaque service.
- La normalisation par ligne montre la répartition en pourcentage du genre au sein de chaque service.
- La normalisation par colonne montre la proportion de répartition de chaque genre entre les services.
Exemple 3 : Variables multiples et fonctions d'agrégation
Vous pouvez utiliser plusieurs variables de ligne/colonne et utiliser des fonctions d'agrégation pour calculer des valeurs statistiques.
Exemples
import numpy as np
# 1. Créer des données de ventes
sales = pd.DataFrame({
'region': ['North', 'North', 'South', 'South', 'East', 'East', 'West', 'West', 'North', 'South'],
'product': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'B', 'A'],
'quarter': ['Q1', 'Q1', 'Q1', 'Q1', 'Q2', 'Q2', 'Q2', 'Q2', 'Q2', 'Q2'],
'sales': [100, 150, 200, 180, 120, 160, 190, 170, 140, 210]
})
print("=== Données de ventes ===")
print(sales)
# 2. Utiliser plusieurs variables de ligne
print("n=== Tableau croisé de la région et du produit (fréquence) ===")
result_multi = pd.crosstab([sales['region'], sales['product']], sales['quarter'])
print(result_multi)
# 3. Utiliser values et aggfunc pour calculer le montant des ventes
print("n=== Ventes totales par région et trimestre ===")
result_sum = pd.crosstab(sales['region'], sales['quarter'], values=sales['sales'], aggfunc='sum')
print(result_sum)
# 4. Calculer le montant moyen des ventes
print("n=== Ventes moyennes par région et trimestre ===")
result_mean = pd.crosstab(sales['region'], sales['quarter'], values=sales['sales'], aggfunc='mean')
print(result_mean.round(1))
Sortie attendue :
=== 销售数据 ===
region product quarter sales
0 North A Q1 100
1 North B Q1 150
2 South A Q1 200
3 South B Q1 180
4 East A Q2 120
5 East B Q2 160
6 West A Q2 190
7 West B Q2 170
8 North B Q2 140
9 South A Q2 210
=== 区域和产品的交叉表(频次)===
quarter Q1 Q2
region product
East A 0 1
B 0 1
North A 1 0
B 1 1
South A 1 1
B 1 0
West A 0 1
B 0 1
=== 区域和季度的销售额合计 ===
quarter Q1 Q2
region
East NaN 280
North 250 140
South 380 210
West NaN 360
=== 区域和季度的平均销售额 ===
quarter Q1 Q2
region
East NaN 140.0
North 125.0 140.0
South 190.0 210.0
West NaN 180.0
Explication du code :
- L'utilisation de plusieurs variables de ligne (sous forme de liste) peut créer un tableau croisé avec une indexation à plusieurs niveaux.
- Chaque cellule affiche le nombre d'occurrences d'une combinaison région-produit spécifique dans un trimestre spécifique.
- L'utilisation des paramètres values et aggfunc vous permet de calculer des agrégations de valeurs numériques réelles (somme, moyenne, etc.).
Exemple 4 : Gestion des valeurs manquantes
dropnaLe paramètre contrôle si les catégories manquantes sont incluses.
Exemples
import numpy as np
# 1. Données contenant des valeurs manquantes
data = pd.DataFrame({
'A': ['a', 'a', 'b', np.nan, 'a', 'b'],
'B': ['x', 'y', 'x', 'x', np.nan, 'y']
})
print("=== Données avec des valeurs manquantes ===")
print(data)
# 2. Par défaut, supprimer les combinaisons contenant des valeurs manquantes
result_drop = pd.crosstab(data['A'], data['B'])
print("n=== Suppression par défaut des valeurs manquantes (dropna=True) ===")
print(result_drop)
# 3. Inclure les catégories manquantes
result_keep = pd.crosstab(data['A'], data['B'], dropna=False)
print("n=== Inclure les catégories manquantes (dropna=False) ===")
print(result_keep)
Sortie attendue :
=== 包含缺失值的数据 ===
A B
0 a x
1 a y
2 b x
3 NaN x
4 a NaN
5 b y
=== 默认移除缺失值 (dropna=True) ===
B x y
A
a 1 1
b 1 1
=== 包含缺失值 (dropna=False) ===
B x y NaN
A
a 1 1 1
b 1 1 0
NaN 1 0 0
Explication du code :
- Par défaut
dropna=Truesupprimera les lignes et les colonnes contenant des valeurs manquantes, en affichant uniquement les données valides. - Utiliser
dropna=Falsepour afficher la fréquence des combinaisons contenant des valeurs manquantes.
Autres extensionsAstuce :
pd.crosstab()adapté à l'analyse des relations entre variables catégorielles. Si vous avez besoin d'une synthèse de données plus complexe (comme le calcul de plusieurs indicateurs d'agrégation), veuillez utiliserpd.pivot_table()fonction.
Fonctions courantes de Pandas