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.
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)
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())