Renommer les colonnes de résultat de Pandas agrégation (“FutureWarning: à l'aide d'un dict avec le renommage est obsolète”)
Je vais essayer de faire des agrégations sur une pandas bloc de données. Voici un exemple de code:
import pandas as pd
df = pd.DataFrame({"User": ["user1", "user2", "user2", "user3", "user2", "user1"],
"Amount": [10.0, 5.0, 8.0, 10.5, 7.5, 8.0]})
df.groupby(["User"]).agg({"Amount": {"Sum": "sum", "Count": "count"}})
Out[1]:
Amount
Sum Count
User
user1 18.0 2
user2 20.5 3
user3 10.5 1
Qui génère le message d'avertissement suivant:
FutureWarning: à l'aide d'un dict avec le renommage est obsolète et sera
supprimée dans une version future de retour super(DataFrameGroupBy,
l'auto).agrégation(arg, *args, **kwargs)
Comment puis-je éviter cela?
- J'aimerais savoir pourquoi c'est amorti (je suis sûr qu'il y est une bonne raison). Quelqu'un aurait-il un lien vers une discussion sur elle?
- Pour se concentrer sur les mots clés de la solution plutôt que de simplement l'existant avertissement, je l'ai rebaptisée "renommer les colonnes de résultat de l'agrégation" et étiqueté. Maintenant, les gens pourraient même trouver cette question 🙂 avant de (disons) de la pas-si-canoniqueNommage des colonnes retournées dans les Pandas fonction d'agrégation?
- J'espère que ce sera abordée dans le github.com/pandas-dev/pandas/issues/18366
- Comment serait-il si je ne fais pas un "groupe", mais je suis en train de faire un "pivot" à la place?
- Voir les pandas 0.25.0 agrégation de reclassement
Vous devez vous connecter pour publier un commentaire.
Utilisation groupby
apply
et le retour d'une Série de renommer les colonnesUtiliser le groupby
apply
méthode pour effectuer une agrégationPour ce faire:
apply
Créer de fausses données
créer une fonction qui retourne une Série
La variable
x
à l'intérieur demy_agg
est un DataFramePasser cette fonction personnalisée à l'égard du groupe
apply
méthodeLe gros inconvénient, c'est que cette fonction sera beaucoup plus lente que
agg
pour la cythonized agrégationsÀ l'aide d'un dictionnaire avec groupby
agg
méthodeÀ l'aide d'un dictionnaire de dictionnaires a été retiré en raison de sa complexité et quelque peu ambiguë. Il y a un discussion en cours sur la façon d'améliorer cette fonctionnalité dans le futur sur github Ici, vous pouvez directement accéder à l'agrégation de colonne après l'égard du groupe d'appel. Tout simplement passer à une liste de tous les agréger les fonctions que vous souhaitez appliquer.
Sortie
Il est toujours possible d'utiliser un dictionnaire explicitement désigner les différentes agrégations dans les différentes colonnes, comme ici, si il y avait une autre colonne numérique nommée
Other
.Sortie
df.columns = ['your', 'new', 'col', 'names']
ou utiliser lerename
méthode qui sera un peu difficile car vous avez cette résultats dans une MultiIndex.df.groupby('User')['Amount'].agg({'Amount' : ['sum', 'count'], 'Other':['max', 'std']})
Si vous remplacez le dictionnaire interne avec une liste de tuples, il se débarrasse de la message d'avertissement
Mise à jour pour les Pandas de 0,25+ L'agrégation de reclassement
De sortie:
C'est ce que j'ai fait:
Créer un faux dataset:
O/P:
J'ai d'abord réalisé à l'Utilisateur de l'index, puis un groupby:
Solution:
Remplacer l'intérieur des dictionnaires avec une liste de correctement les fonctions nommées.
Pour renommer la fonction que j'utilise cette fonction d'utilité:
Le groupe-par déclaration devient alors:
Si vous avez plus de, réutilisable agrégation spécifications, vous pouvez les convertir avec
De sorte que vous pouvez dire
Voir aussi https://github.com/pandas-dev/pandas/issues/18366#issuecomment-476597674