J'ai un bloc de données df
et j'utilise plusieurs colonnes pour groupby
:
df['col1','col2','col3','col4'].groupby(['col1','col2']).mean()
De la manière ci-dessus, j'obtiens presque la table (trame de données) dont j'ai besoin. Ce qui manque, c'est une colonne supplémentaire qui contient le nombre de lignes dans chaque groupe. En d'autres termes, je veux dire, mais j'aimerais aussi savoir combien de numéros ont été utilisés pour obtenir ces moyens. Par exemple, dans le premier groupe, il y a 8 valeurs et dans le second 10 et ainsi de suite.
En bref: comment obtenir des statistiques par groupe pour une trame de données?
df[['col1','col2','col3','col4']].groupby(['col1','col2']).agg(['mean', 'count'])
count
colonne par groupe.result = df['col1','col2','col3','col4'].groupby(['col1', 'col2']).mean() ; counts = times.groupby(['col1', 'col2']).size() ; result['count'] = counts
Réponse rapide:
Le moyen le plus simple d'obtenir le nombre de lignes par groupe est d'appeler
.size()
, ce qui renvoie aSeries
:Habituellement, vous voulez que ce résultat soit un
DataFrame
(au lieu d'unSeries
) afin que vous puissiez faire:Si vous souhaitez savoir comment calculer le nombre de lignes et d'autres statistiques pour chaque groupe, continuez à lire ci-dessous.
Exemple détaillé:
Considérez l'exemple de trame de données suivant:
Utilisons d'abord
.size()
pour obtenir le nombre de lignes:Utilisons ensuite
.size().reset_index(name='counts')
pour obtenir le nombre de lignes:Inclure les résultats pour plus de statistiques
Lorsque vous souhaitez calculer des statistiques sur des données groupées, cela ressemble généralement à ceci:
Le résultat ci-dessus est un peu ennuyeux à traiter en raison des étiquettes de colonne imbriquées et également parce que le nombre de lignes est basé sur une colonne.
Pour gagner plus de contrôle sur la sortie, je divise généralement les statistiques en agrégations individuelles que je combine ensuite en utilisant
join
. Cela ressemble à ceci:Notes de bas de page
Le code utilisé pour générer les données de test est indiqué ci-dessous:
Avertissement:
Si certaines des colonnes que vous agrégez ont des valeurs nulles, alors vous voulez vraiment regarder le nombre de lignes de groupe comme une agrégation indépendante pour chaque colonne. Sinon, vous pourriez être induit en erreur quant au nombre d'enregistrements réellement utilisés pour calculer des choses comme la moyenne, car les pandas supprimeront les
NaN
entrées dans le calcul de la moyenne sans vous en informer.la source
In [5]: counts_df = pd.DataFrame(df.groupby('col1').size().rename('counts'))
, il est peut-être préférable de définir la taille () comme une nouvelle colonne si vous souhaitez manipuler le cadre de données pour une analyse plus approfondie, ce qui devrait êtrecounts_df = pd.DataFrame(df.groupby('col1').size().reset_index(name='counts')
isnull
à cette requête pour l'avoir également dans une colonne?'col4': ['median', 'min', 'count', 'isnull']
Une fonction pour les gouverner tous:
GroupBy.describe
Retours
count
,mean
,std
et d' autres statistiques utiles par groupe.Pour obtenir des statistiques spécifiques, il suffit de les sélectionner,
describe
fonctionne pour plusieurs colonnes ( passez['C']
à['C', 'D']
- ou supprimez-le complètement - et voyez ce qui se passe, le résultat est une trame de données à colonnes MultiIndexed).Vous obtenez également différentes statistiques pour les données de chaîne. Voici un exemple,
Pour plus d'informations, consultez la documentation .
la source
Nous pouvons facilement le faire en utilisant groupby et count. Mais, nous devons nous rappeler d'utiliser reset_index ().
la source
Pour obtenir plusieurs statistiques, réduisez l'index et conservez les noms des colonnes:
Produit:
la source
Créez un objet de groupe et appelez des méthodes comme dans l'exemple ci-dessous:
la source
Veuillez essayer ce code
Je pense que le code ajoutera une colonne appelée 'count it' qui compte chaque groupe
la source