Dans pandas, vous pouvez trier les donnรฉes avec ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.๐โ๐ฎโ๐ญโ() et ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.๐ชโ๐โ๐ฎโ๐ญโ() .
Cet article dรฉcrit comment utiliser ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.๐โ๐ฎโ๐ญโ() et ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.๐ชโ๐โ๐ฎโ๐ญโ() .
- Binning avec des intervalles รฉgaux ou des valeurs limites donnรฉes : ๐ฉโ๐โ.๐โ๐ฎโ๐ญโ()
- Spรฉcifiez le nombre de bacs de largeur รฉgale
- Spรฉcifiez les bords du bac (valeurs limites)
- Obtenir les bacs calculรฉs ou spรฉcifiรฉs : ๐ซโ๐โ๐ญโ๐โ๐ขโ๐งโ๐ฌโ
- Spรฉcifiez si le bord le plus ร droite est inclus ou non : ๐ซโ๐ขโ๐ โ๐กโ๐ญโ
- Spรฉcifiez les รฉtiquettes : ๐ฅโ๐โ๐โ๐โ๐ฅโ๐ฌโ
- Spรฉcifiez la prรฉcision des valeurs limites : ๐ฉโ๐ซโ๐โ๐โ๐ขโ๐ฌโ๐ขโ๐จโ๐งโ
- Binning pour rendre le nombre d’รฉlรฉments รฉgal : ๐ฉโ๐โ.๐ชโ๐โ๐ฎโ๐ญโ()
- Prรฉcisez le nombre de bacs
- Pour les valeurs en double
- Comptez le nombre d’รฉlรฉments dans le bac : ๐ฏโ๐โ๐ฅโ๐ฎโ๐โ_๐โ๐จโ๐ฎโ๐งโ๐ญโ๐ฌโ()
- Pour la liste Python et le tableau NumPy
- Exemple : donnรฉes du Titanic
Utilisez l’exemple suivant ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.S๐โ๐ซโ๐ขโ๐โ๐ฌโ .
import pandas as pd s = pd.Series(data=[x**2 for x in range(11)], index=list('abcdefghijk')) print(s) # a 0 # b 1 # c 4 # d 9 # e 16 # f 25 # g 36 # h 49 # i 64 # j 81 # k 100 # dtype: int64
Binning avec des intervalles รฉgaux ou des valeurs limites donnรฉes : ๐ฉโ๐โ.๐โ๐ฎโ๐ญโ()
Dans ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.๐โ๐ฎโ๐ญโ() , le premier paramรจtre ๐ฑโ est un tableau unidimensionnel (liste Python ou , ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.S๐โ๐ซโ๐ขโ๐โ๐ฌโ ) comme donnรฉes source, et le deuxiรจme paramรจtre ๐โ๐ขโ๐งโ๐ฌโ est le paramรจtre de division du bac.
Spรฉcifiez le nombre de bacs de largeur รฉgale
Vous pouvez prรฉciser le nombre de bacs de รฉgale en spรฉcifiant une valeur entiรจre pour ๐โ๐ขโ๐งโ๐ฌโ .
s_cut = pd.cut(s, 4) print(s_cut) # a (-0.1, 25.0] # b (-0.1, 25.0] # c (-0.1, 25.0] # d (-0.1, 25.0] # e (-0.1, 25.0] # f (-0.1, 25.0] # g (25.0, 50.0] # h (25.0, 50.0] # i (50.0, 75.0] # j (75.0, 100.0] # k (75.0, 100.0] # dtype: category # Categories (4, interval[float64]): [(-0.1, 25.0] < (25.0, 50.0] < (50.0, 75.0] < (75.0, 100.0]] print(type(s_cut)) # <class 'pandas.core.series.Series'>
(๐โ, ๐โ] signifie ๐โ < ๐ฑโ <= ๐โ .
Spรฉcifiez les bords du bac (valeurs limites)
Vous pouvez prรฉciser les bords du bac, les valeurs limites, en spรฉcifiant une liste pour ๐โ๐ขโ๐งโ๐ฌโ . Les รฉlรฉments en dehors de la plage sont sรฉlectionnรฉs comme N๐โN .
print(pd.cut(s, [0, 10, 50, 100])) # a NaN # b (0, 10] # c (0, 10] # d (0, 10] # e (10, 50] # f (10, 50] # g (10, 50] # h (10, 50] # i (50, 100] # j (50, 100] # k (50, 100] # dtype: category # Categories (3, interval[int64]): [(0, 10] < (10, 50] < (50, 100]]
Obtenir les bacs calculรฉs ou spรฉcifiรฉs : ๐ซโ๐โ๐ญโ๐โ๐ขโ๐งโ๐ฌโ
Avec ๐ซโ๐โ๐ญโ๐โ๐ขโ๐งโ๐ฌโ=T๐ซโ๐ฎโ๐โ , vous pouvez obtenir des bacs, c’est-ร -dire une liste de valeurs limites en plus des donnรฉes regroupรฉes.
s_cut, bins = pd.cut(s, 4, retbins=True) print(s_cut) # a (-0.1, 25.0] # b (-0.1, 25.0] # c (-0.1, 25.0] # d (-0.1, 25.0] # e (-0.1, 25.0] # f (-0.1, 25.0] # g (25.0, 50.0] # h (25.0, 50.0] # i (50.0, 75.0] # j (75.0, 100.0] # k (75.0, 100.0] # dtype: category # Categories (4, interval[float64]): [(-0.1, 25.0] < (25.0, 50.0] < (50.0, 75.0] < (75.0, 100.0]] print(bins) print(type(bins)) # [ -0.1 25. 50. 75. 100. ] # <class 'numpy.ndarray'>
Spรฉcifiez si le bord le plus ร droite est inclus ou non : ๐ซโ๐ขโ๐ โ๐กโ๐ญโ
Par dรฉfaut, le bord le plus ร droite est inclus et le bord le plus ร gauche ne l’est pas. Si ๐ซโ๐ขโ๐ โ๐กโ๐ญโ=F๐โ๐ฅโ๐ฌโ๐โ , au contraire, le bord le plus ร droite n’est pas inclus.
print(pd.cut(s, 4, right=False)) # a [0.0, 25.0) # b [0.0, 25.0) # c [0.0, 25.0) # d [0.0, 25.0) # e [0.0, 25.0) # f [25.0, 50.0) # g [25.0, 50.0) # h [25.0, 50.0) # i [50.0, 75.0) # j [75.0, 100.1) # k [75.0, 100.1) # dtype: category # Categories (4, interval[float64]): [[0.0, 25.0) < [25.0, 50.0) < [50.0, 75.0) < [75.0, 100.1)]
Spรฉcifiez les รฉtiquettes : ๐ฅโ๐โ๐โ๐โ๐ฅโ๐ฌโ
Vous pouvez dรฉfinir des libellรฉs avec le paramรจtre ๐ฅโ๐โ๐โ๐โ๐ฅโ๐ฌโ . Les libellรฉs par dรฉfaut sont du type (๐โ, ๐โ] , comme dans les exemples prรฉcรฉdents.
Si ๐ฅโ๐โ๐โ๐โ๐ฅโ๐ฌโ=F๐โ๐ฅโ๐ฌโ๐โ , les index entiers (numรฉros sรฉquentiels commenรงant ร 0) sont utilisรฉs comme รฉtiquettes.
print(pd.cut(s, 4, labels=False)) # a 0 # b 0 # c 0 # d 0 # e 0 # f 0 # g 1 # h 1 # i 2 # j 3 # k 3 # dtype: int64
Vous pouvez รฉgalement prรฉciser une liste de n’importe quelle libellรฉe. Notez qu’une erreur est gรฉnรฉrรฉe si le nombre de compartiments ne correspond pas au nombre d’รฉlรฉments de la liste.
print(pd.cut(s, 4, labels=['small', 'medium', 'large', 'x-large'])) # a small # b small # c small # d small # e small # f small # g medium # h medium # i large # j x-large # k x-large # dtype: category # Categories (4, object): [small < medium < large < x-large]
Spรฉcifiez la prรฉcision des valeurs limites : ๐ฉโ๐ซโ๐โ๐โ๐ขโ๐ฌโ๐ขโ๐จโ๐งโ
Vous pouvez prรฉciser la prรฉcision (nombre de dรฉcimales) des valeurs limites avec le paramรจtre ๐ฉโ๐ซโ๐โ๐โ๐ขโ๐ฌโ๐ขโ๐จโ๐งโ .
print(pd.cut(s, 3)) # a (-0.1, 33.333] # b (-0.1, 33.333] # c (-0.1, 33.333] # d (-0.1, 33.333] # e (-0.1, 33.333] # f (-0.1, 33.333] # g (33.333, 66.667] # h (33.333, 66.667] # i (33.333, 66.667] # j (66.667, 100.0] # k (66.667, 100.0] # dtype: category # Categories (3, interval[float64]): [(-0.1, 33.333] < (33.333, 66.667] < (66.667, 100.0]] print(pd.cut(s, 3, precision=1)) # a (-0.1, 33.3] # b (-0.1, 33.3] # c (-0.1, 33.3] # d (-0.1, 33.3] # e (-0.1, 33.3] # f (-0.1, 33.3] # g (33.3, 66.7] # h (33.3, 66.7] # i (33.3, 66.7] # j (66.7, 100.0] # k (66.7, 100.0] # dtype: category # Categories (3, interval[float64]): [(-0.1, 33.3] < (33.3, 66.7] < (66.7, 100.0]]
Binning pour rendre le nombre d’รฉlรฉments รฉgal : ๐ฉโ๐โ.๐ชโ๐โ๐ฎโ๐ญโ()
๐ชโ๐โ๐ฎโ๐ญโ() divise les donnรฉes de sorte que le nombre d’รฉlรฉments dans chaque compartiment soit aussi รฉgal que possible.
Le premier paramรจtre ๐ฑโ est un tableau unidimensionnel (liste Python ou ๐งโ๐ฎโ๐ฆโ๐ฉโ๐ฒโ.๐งโ๐โ๐โ๐ซโ๐ซโ๐โ๐ฒโ , ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.S๐โ๐ซโ๐ขโ๐โ๐ฌโ ) comme donnรฉes source, et le deuxiรจme paramรจtre ๐ชโ est le nombre de bacs.
Vous pouvez dรฉfinir les mรชmes paramรจtres que dans ๐โ๐ฎโ๐ญโ() , ๐ฅโ๐โ๐โ๐โ๐ฅโ๐ฌโ et ๐ซโ๐โ๐ญโ๐โ๐ขโ๐งโ๐ฌโ .
Prรฉcisez le nombre de bacs
Vous pouvez prรฉciser le nombre de divisions dans ๐ชโ .
Si ๐ชโ=2 , les donnรฉes sont divisรฉes par 2-quantile (mรฉdiane).
print(pd.qcut(s, 2)) # a (-0.001, 25.0] # b (-0.001, 25.0] # c (-0.001, 25.0] # d (-0.001, 25.0] # e (-0.001, 25.0] # f (-0.001, 25.0] # g (25.0, 100.0] # h (25.0, 100.0] # i (25.0, 100.0] # j (25.0, 100.0] # k (25.0, 100.0] # dtype: category # Categories (2, interval[float64]): [(-0.001, 25.0] < (25.0, 100.0]]
Si ๐ชโ=4 , les donnรฉes sont divisรฉes par 4 quantiles (quartiles).
s_qcut, bins = pd.qcut(s, 4, labels=['Q1', 'Q2', 'Q3', 'Q4'], retbins=True) print(s_qcut) # a Q1 # b Q1 # c Q1 # d Q2 # e Q2 # f Q2 # g Q3 # h Q3 # i Q4 # j Q4 # k Q4 # dtype: category # Categories (4, object): [Q1 < Q2 < Q3 < Q4] print(bins) # [ 0. 6.5 25. 56.5 100. ]
Pour les valeurs en double
Soyez prudent lorsqu’il y a des รฉlรฉments en double dans les donnรฉes d’origine.
Par exemple, si les valeurs sont dupliquรฉes jusqu’ร la mรฉdiane :
s_duplicate = pd.Series(data=[0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6], index=list('abcdefghijk')) print(s_duplicate) # a 0 # b 0 # c 0 # d 0 # e 0 # f 1 # g 2 # h 3 # i 4 # j 5 # k 6 # dtype: int64
Il est possible de diviser par 2 ร la mรฉdiane lorsque ๐ชโ=2 , mais un plus grand nombre de divisions entraรฎnera une erreur.
print(pd.qcut(s_duplicate, 2)) # a (-0.001, 1.0] # b (-0.001, 1.0] # c (-0.001, 1.0] # d (-0.001, 1.0] # e (-0.001, 1.0] # f (-0.001, 1.0] # g (1.0, 6.0] # h (1.0, 6.0] # i (1.0, 6.0] # j (1.0, 6.0] # k (1.0, 6.0] # dtype: category # Categories (2, interval[float64]): [(-0.001, 1.0] < (1.0, 6.0]] # print(pd.qcut(s_duplicate, 4)) # ValueError: Bin edges must be unique: array([0. , 0. , 1. , 3.5, 6. ]). # You can drop duplicate edges by setting the 'duplicates' kwarg
Par exemple, dans le cas de 4 divisions, les valeurs minimales, 25 %, 50 %, 75 % et maximales sont dรฉfinies comme valeurs limites, mais s’il y a beaucoup d’รฉlรฉments qui se chevauchent comme dans l’exemple, les valeurs minimales et 25 % sont la mรชme valeur, ce qui est la cause de l’erreur.
Si ๐โ๐ฎโ๐ฉโ๐ฅโ๐ขโ๐โ๐โ๐ญโ๐โ๐ฌโ=’๐โ๐ซโ๐จโ๐ฉโ’ , les valeurs limites en double sont exclues.
print(pd.qcut(s_duplicate, 4, duplicates='drop')) # a (-0.001, 1.0] # b (-0.001, 1.0] # c (-0.001, 1.0] # d (-0.001, 1.0] # e (-0.001, 1.0] # f (-0.001, 1.0] # g (1.0, 3.5] # h (1.0, 3.5] # i (3.5, 6.0] # j (3.5, 6.0] # k (3.5, 6.0] # dtype: category # Categories (3, interval[float64]): [(-0.001, 1.0] < (1.0, 3.5] < (3.5, 6.0]]
Comptez le nombre d’รฉlรฉments dans le bac : ๐ฏโ๐โ๐ฅโ๐ฎโ๐โ_๐โ๐จโ๐ฎโ๐งโ๐ญโ๐ฌโ()
Vous pouvez obtenir le nombre d’รฉlรฉments dans un bac en appelant la mรฉthode ๐ฏโ๐โ๐ฅโ๐ฎโ๐โ_๐โ๐จโ๐ฎโ๐งโ๐ญโ๐ฌโ() ร partir de la mรฉthode ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.S๐โ๐ซโ๐ขโ๐โ๐ฌโ renvoyรฉe par ๐โ๐ฎโ๐ญโ() ou ๐ชโ๐โ๐ฎโ๐ญโ() .
counts = pd.cut(s, 3, labels=['S', 'M', 'L']).value_counts() print(counts) # S 6 # M 3 # L 2 # dtype: int64 print(type(counts)) # <class 'pandas.core.series.Series'> print(counts['M']) # 3
๐ฏโ๐โ๐ฅโ๐ฎโ๐โ_๐โ๐จโ๐ฎโ๐งโ๐ญโ๐ฌโ() est รฉgalement fourni en tant que fonction ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.๐ฏโ๐โ๐ฅโ ๐ฎโ๐โ_๐โ๐จโ๐ฎโ๐งโ๐ญโ๐ฌโ() .
print(pd.value_counts(pd.cut(s, 3, labels=['S', 'M', 'L']))) # S 6 # M 3 # L 2 # dtype: int64
Pour la liste Python et le tableau NumPy
Les exemples prรฉcรฉdents ont utilisรฉ ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.S๐โ๐ซโ๐ขโ๐โ๐ฌโ comme donnรฉes source, mais le premier paramรจtre ๐ฑโ de ๐โ๐ฎโ๐ญโ() ou ๐ชโ๐โ๐ฎโ๐ญโ() peut รชtre une liste Python ou un tableau NumPy ๐งโ๐โ๐โ๐ซโ๐ซโ๐โ๐ฒโ s’il est unidimensionnel.
l = [x**2 for x in range(11)] print(l) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100] l_cut = pd.cut(l, 3, labels=['S', 'M', 'L']) print(l_cut) # [S, S, S, S, S, ..., M, M, M, L, L] # Length: 11 # Categories (3, object): [S < M < L] print(type(l_cut)) # <class 'pandas.core.categorical.Categorical'>
Vous pouvez obtenir des รฉlรฉments par index et les convertir en liste Python avec ๐ฅโ๐ขโ๐ฌโ๐ญโ() .
print(l_cut[0]) # S print(list(l_cut)) # ['S', 'S', 'S', 'S', 'S', 'S', 'M', 'M', 'M', 'L', 'L']
Si vous souhaitez compter le nombre d’รฉlรฉments dans un bac, utilisez ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.๐ฏโ๐โ๐ฅโ ๐ฎโ๐โ_๐โ๐จโ๐ฎโ๐งโ๐ญโ๐ฌโ() .
print(pd.value_counts(l_cut)) # S 6 # M 3 # L 2 # dtype: int64
Exemple : donnรฉes du Titanic
Utilisez les donnรฉes du Titanic comme exemple. Vous pouvez les tรฉlรฉcharger depuis Kaggle .
Il est รฉgalement disponible ici.
Certaines colonnes sont exclues.
df_titanic = pd.read_csv('data/src/titanic_train.csv').drop(['Name', 'Ticket', 'Cabin', 'Embarked'], axis=1) print(df_titanic.head()) # PassengerId Survived Pclass Sex Age SibSp Parch Fare # 0 1 0 3 male 22.0 1 0 7.2500 # 1 2 1 1 female 38.0 1 0 71.2833 # 2 3 1 3 female 26.0 0 0 7.9250 # 3 4 1 1 female 35.0 1 0 53.1000 # 4 5 0 3 male 35.0 0 0 8.0500
Supprimez la colonne ยซ A๐ โ๐โ ยป avec ๐โ๐ฎโ๐ญโ() .
print(df_titanic['Age'].describe()) # count 714.000000 # mean 29.699118 # std 14.526497 # min 0.420000 # 25% 20.125000 # 50% 28.000000 # 75% 38.000000 # max 80.000000 # Name: Age, dtype: float64 print(pd.cut(df_titanic['Age'], 5, precision=0).value_counts(sort=False, dropna=False)) # (0.0, 16.0] 100 # (16.0, 32.0] 346 # (32.0, 48.0] 188 # (48.0, 64.0] 69 # (64.0, 80.0] 11 # NaN 177 # Name: Age, dtype: int64
Pour ajouter le rรฉsultat en tant que nouvelle colonne ร la colonne D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ d’origine, procรฉdez comme suit. Pour รฉcraser une colonne existante, nommez simplement la colonne de gauche avec le nom de la colonne existante.
df_titanic['Age_bin'] = pd.cut(df_titanic['Age'], 5, labels=False) print(df_titanic.head()) # PassengerId Survived Pclass Sex Age SibSp Parch Fare Age_bin # 0 1 0 3 male 22.0 1 0 7.2500 1.0 # 1 2 1 1 female 38.0 1 0 71.2833 2.0 # 2 3 1 3 female 26.0 0 0 7.9250 1.0 # 3 4 1 1 female 35.0 1 0 53.1000 2.0 # 4 5 0 3 male 35.0 0 0 8.0500 2.0
Notez que, dans cet exemple, le processus de binning est effectuรฉ immรฉdiatement pour plus de commoditรฉ, mais idรฉalement, la valeur manquante N๐โN doit d’abord รชtre complรฉtรฉe avant le binning.
