0
votes

Créer de nouveaux pandas.dataframe avec .groupby (...). AGG (somme) puis récupérer des colonnes non élaborées

Je commence par un Dataframe de saisons BASEABLL Une section similaire à celle-ci: XXX

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.

Mon point de départ hypothétique est DF_Careers = DF_SEASONS .groupby ('playerid'). AGG (somme) mais cela laisse toutes les données non numériques. Avec numeric_only = false 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) (ou un processus similaire) pour le faire, si possible.

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.


0 commentaires

3 Réponses :


0
votes

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


1 commentaires

Fonctionne, mais très lent pour mon jeu de données réel.



0
votes

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


2 commentaires

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 lorsque je exécute carrières ['nom'] = carrières.index.map (nom_map) . 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).



0
votes

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)


0 commentaires