1
votes

Comment additionner les premières valeurs d'un résultat groupby et l'écrire sous forme de colonne df dans le groupe concerné

J'ai un bloc de données qui ressemble à ceci (voir ci-dessous):

NBAData['TotalTeamVal'] = NBAData.groupby(['Team', 'Player Name'])['PlayerMarketValue'].first().sum()

J'essaie de trouver un bon moyen de regrouper à la fois Team et ensuite PlayerName et à partir de là, prenez la première instance de PlayerMarketValue , puis additionnez-la et écrivez cette valeur dans son équipe respective.

J'ai touché le bloc après être arrivé à:

Player Name         Team                    PlayerMarketValue

Steph Curry         Golden State Warriors   169027.4782
Steph Curry         Golden State Warriors   169027.4782
Steph Curry         Golden State Warriors   169027.4782
Steph Curry         Golden State Warriors   169027.4782
Lebron James        All Stars               120896.3772
Lebron James        All Stars               120896.3772
Lebron James        All Stars               120896.3772
Luka Doncic         All Stars               36789.6562
Luka Doncic         All Stars               36789.6562
Luka Doncic         All Stars               36789.6562

Ie: Je recherche (notez le All Stars en particulier):

 entrez la description de l'image ici


2 commentaires

Veuillez copier / coller les données sous forme de texte.


pourriez-vous s'il vous plaît clarifier pourquoi vous choisissez la première rangée? Existe-t-il un critère particulier ou simplement parce que vous avez besoin de l'une des valeurs?


3 Réponses :


1
votes

Sans en savoir beaucoup sur la structure des données, je suppose qu'un joueur ne peut faire partie que d'une des équipes, donc je commencerais

  1. supprimer les lignes en double associées à chaque joueur
  2. additionner les valeurs des joueurs d'une équipe
  3. réinitialiser l'index et tout fusionner avec le DataFrame principal en utilisant les colonnes de l'équipe comme clé
pd.merge(df, 
         df.drop_duplicates('Player Name').groupby(['Team'])['PlayerMarketValue'].sum().reset_index(), 
         on='Team', 
         suffixes= ['', '_Team']
         )


1 commentaires

Merci pour votre contribution - c'était très concis et utile.



1
votes

Vous pouvez regrouper par équipe sur le nouveau dataframe, obtenir la valeur totale et fusionner:

df.merge(df.groupby(['Player Name', 'Team'])
           .PlayerMarketValue.first()
           .groupby(['Team']).sum(),
         left_on='Team',
         right_index=True,
         suffixes=('','Total')
)


7 commentaires

Pourquoi ne pas utiliser groupby transform? Est-ce que je manque quelque chose


Transformez-vous sur quel groupe par?


ou pourquoi groupby deux fois, alors que vous voulez simplement supprimer les doublons ...?


@ user7440787 c'est vrai. Cependant, vous avez déjà répondu avec drop_duplicates , et cela va dans le sens de la pensée d’OP.


@Datanovice Vous auriez probablement un problème avec les dimensions de la dataframe résultante (c'est pourquoi nous utilisons la fusion) ou, d'autre part, une opération inefficace car vous auriez à calculer la valeur totale de chaque équipe, encore et encore.


@QuangHoang désolé, vient de reprendre la question, cela a du sens maintenant, merci mon pote.


Merci @QuangHoang pour votre contribution - malheureusement, cela n'a pas fonctionné pour moi tout de suite. Le problème était qu'il fallait une étape supplémentaire pour changer la série de pandas générés par le groupby en un dataframe avant de fusionner. Très apprécié pour votre contribution. C'est toujours bon de voir différentes perspectives et j'accepterais cela comme la réponse principale si je le pouvais.



-1
votes

Vous pouvez essayer la méthode mentionnée ci-dessous. J'espère que cela vous aidera.

NBAData=NBAData.groupby(["Player_name","Team"]).first()


1 commentaires

Cela ne vous permettra d'obtenir que la première ligne de chaque groupe? Comment est-il censé répondre à la question?