web-dev-qa-db-fra.com

Comptage de valeurs non nulles dans chaque colonne d’un cadre de données dans python

J'ai un python-pandas-dataframe dans lequel la première colonne est user_id et le reste des colonnes sont des balises (tag_0 à tag_122). J'ai les données dans le format suivant:

UserId  Tag_0   Tag_1
7867688 0   5
7867688 0   3
7867688 3   0
7867688 3.5 3.5
7867688 4   4
7867688 3.5 0

Mon objectif est d’obtenir Sum(Tag)/Count(NonZero(Tags)) pour chaque utilisateur.

df.groupby('user_id').sum(), me donne sum(tag), mais je n'ai aucune idée du fait de compter des valeurs non nulles

Est-il possible d’obtenir Sum(Tag)/Count(NonZero(Tags)) en une seule commande?

En MySQL, je pourrais y arriver comme suit: -

select user_id, sum(tag)/count(nullif(tag,0)) from table group by 1

Toute aide sera appréciée.

45
Harsh Singal

Ma manière préférée d’obtenir le nombre de nonzeros dans chaque colonne est

df.astype(bool).sum(axis=0)

Pour le nombre de non-zéros dans chaque ligne, utilisez

df.astype(bool).sum(axis=1)

(Merci à Skulas)

Si vous avez des nans dans votre df, vous devez d'abord écrire ces zéro, sinon ils seront comptés comme 1.

df.fillna(0).astype(bool).sum(axis=1)

(Merci à SirC)

95
The Unfun Cat

Pour compter des valeurs non nulles, faites juste (column!=0).sum(), où column représente les données pour lesquelles vous souhaitez le faire. column != 0 renvoie un tableau booléen, et True est égal à 1 et False à 0. En résumé, cela vous donne le nombre d'éléments correspondant à la condition.

Donc, pour obtenir le résultat souhaité, faites

df.groupby('user_id').apply(lambda column: column.sum()/(column != 0).sum())
11
BrenBarn