Débutant en programmation, pardonnez-moi si c'est vraiment simple

Je sais que nous devrions pouvoir utiliser une liste pour regrouper les pandas, et ils doivent être de longueur égale, mais d'une manière ou d'une autre, je ne parviens pas à le faire fonctionner?

Utilisation de l'ensemble de données Titanic de seaborn
Fonction pour définir les tranches d'âge

def age_groups(x):
    array = []
    for i in x['age']:
        if(math.isnan(i)):
            array.append(9)
        if(i < 20):
            array.append(1)
        if(i < 40):
            array.append(2)
        if(i < 60):
            array.append(3)
        else:
            array.append(4)
    return array

groups = age_groups(titanic)
titanic.groupby(groups).mean()

J'obtiens l'erreur suivante

Fichier "pandas\hashtable.pyx", ligne 683, dans pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:12322)

KeyError: 2

Merci d'avance

2
Ovidius Mazuru 14 mars 2019 à 19:12

2 réponses

Meilleure réponse

Il existe un moyen plus simple d'obtenir les tranches d'âge et c'est d'utiliser numpy.digitize, qui renvoie un entier dépendant du casier auquel une valeur appartient, avec 0 et len(bins) (ici 5) étant sous - et débordement, respectivement. Les NaN semblent aller dans le débordement (puisqu'ils ne se comparent pas plus petits que n'importe quel nombre).

groups = np.digitize(titanic.age, [0, 20, 40, 60, titanic.age.max() + 1])
titanic.groupby(groups).age.mean()
# 1    11.979695
# 2    28.580103
# 3    47.354015
# 4    65.096154
# 5          NaN
# Name: age, dtype: float64
1
Graipher 14 mars 2019 à 16:25

Vous devez vous assurer que la variable que vous transmettez à la fonction groupby est contenue dans le dataframe :

import seaborn as sns
import numpy as np

titanic = sns.load_dataset('titanic')

titanic['groups'] = titanic['age']
titanic.loc[np.isnan(titanic.age), 'groups'] = 9
titanic.loc[titanic.age >= 60, 'groups'] = 4
titanic.loc[titanic.age < 60, 'groups'] = 3
titanic.loc[titanic.age < 40, 'groups'] = 2
titanic.loc[titanic.age < 20, 'groups'] = 1
titanic.groupby('groups').mean()


        survived    pclass        age  ...       fare  adult_male     alone
groups                                 ...                                 
1.0     0.481707  2.530488  11.979695  ...  31.794741    0.298780  0.329268
2.0     0.387597  2.304910  28.580103  ...  32.931200    0.658915  0.653747
3.0     0.394161  1.824818  47.354015  ...  41.481784    0.635036  0.569343
4.0     0.269231  1.538462  65.096154  ...  43.467950    0.846154  0.730769
9.0     0.293785  2.598870        NaN  ...  22.158567    0.700565  0.751412

[5 rows x 8 columns]
1
Nathaniel 14 mars 2019 à 16:23