Je commence par un Dataframe de saisons BASEABLL Une section similaire à celle-ci: de ces saisons, je souhaite créer un Dataframe de statistiques de carrière; C'est-à-dire une rangée pour chaque joueur qui est une somme de leur AB, H, etc. Ce Dataframe doit toujours inclure les noms des joueurs. Le PlayerID dans ce qui précède est une clé unique pour chaque joueur et doit être un index ou une valeur inchangée dans une colonne après la création des statistiques de carrière Dataframe. P> Mon point de départ hypothétique est Je suppose qu'il y a Un moyen assez simple de le faire, mais je n'ai commencé que d'apprendre des pandas il y a une semaine, il y a donc des lacunes à ma connaissance. p> p> DF_Careers = DF_SEASONS .groupby ('playerid'). AGG (somme) code> mais cela laisse toutes les données non numériques. Avec numeric_only = false code> Je peux avoir une sorte de désordre dans les colonnes de noms tels que "Ichiro Suzukiichio Suzukiichio Suzuki" de la concaténation, mais cela nécessite juste un tas de nettoyage. C'est quelque chose que j'aimerais pouvoir faire avec d'autres ensembles de données et les données réellement que j'ai ressemblent davantage à 25 colonnes. Je préfère donc comprendre une routine spécifique pour obtenir le nom des données en arrière ou la préservant à partir du début. que d'écrire une fonction spécifique et d'utiliser groupby ('playerid'). AGG (FUNC) CODE> (ou un processus similaire) pour le faire, si possible. P>
3 Réponses :
Vous pouvez écrire votre propre condition comment vous voulez inclure des colonnes non additionnées.
Name Season AB H SB playerid playerid 190 Nomar_Garciaparra 2000 529 197 5 190 432 Todd_Helton 2000 580 216 5 432 746 A.J._Pierzynski 4019 1012 287 2 1492 1101 Ichiro_Suzuki 2004 704 262 36 1101 1001942 Rod_Carew 1977 616 239 23 1001942 1009405 Stan_Musial 1948 611 230 7 1009405
Fonctionne, mais très lent pour mon jeu de données réel.
S'il y a une relation individuelle entre "PlayerID" et "nom", comme cela semble être le cas, vous pouvez simplement inclure "Nom" dans les colonnes groupby code>: AB H SB Name
playerid
190 529 197 5 Nomar Garciaparra
432 580 216 5 Todd Helton
746 1012 287 2 A.J. Pierzynski
1101 704 262 36 Ichiro Suzuki
1001942 616 239 23 Rod Carew
1009405 611 230 7 Stan Musial
La collecte totale de données que je travaille comprend des noms répétés (c'est tout joueur de balle depuis 1947.) En fait, il y a des gars que vous n'avez jamais entendu parler, sauf qu'ils partagent un nom avec un hall de renom. Quoi qu'il en soit, pour une raison quelconque, j'obtiens TypeError: l'objet dict n'est pas appelable code> lorsque je exécute carrières ['nom'] = carrières.index.map (nom_map) code>. Cela fait si sens pour moi, car la carte prend clairement des dictionnaires comme des arguments.
En réfléchissant à nouveau à nouveau, la première solution ne nécessite pas de relation unique. Si vous avez ID 1 = John Smith et ID 2 = John Smith, ils seront dans des groupes séparés si vous collectez à la fois par ID et par nom. Donc, je pense que c'est la voie à suivre ici. Je ne sais pas pourquoi la deuxième solution ne fonctionne pas, il suffit de la tester à nouveau et à toutes les fines (Python 3.7.7, Pandas 1.0.3).
groupy.agg () peut accepter un dictionnaire qui mappe les noms de colonnes sur les fonctions. Donc, une solution consiste à réussir un dictionnaire à AGG, spécifiant quelles fonctions à appliquer à chaque colonne.
Utilisation des données d'échantillonnage ci-dessus, on peut utiliser p>
dictionary = { x : sum for x in df.columns}
dont_sum = {'Name': max, 'Season': max}
dictionary.update(dont_sum)
df_1 = df.groupby('playerid').agg(dictionary)