1). J'ai l'exemple de données suivant:
>>> df
ID Region count
0 100 Asia 2
1 101 Europe 3
2 102 US 1
3 103 Africa 5
4 100 Russia 5
5 101 Australia 7
6 102 US 8
7 104 Asia 10
8 105 Europe 11
9 110 Africa 23
Je voulais regrouper les observations de cet ensemble de données par ID et par région et en additionner le nombre pour chaque groupe. Alors j'ai utilisé quelque chose comme ça:
>>> print(df.groupby(['ID','Region'],as_index=False).count().sum())
ID Region count
0 100 Asia 2
1 100 Russia 5
2 101 Australia 7
3 101 Europe 3
4 102 US 9
5 103 Africa 5
6 104 Asia 10
7 105 Europe 11
8 110 Africa 23
En utilisant as_index = False, je peux obtenir une sortie "semblable à SQL". Mon problème est que je ne peux pas renommer le nombre de variables agrégées ici. Donc, en SQL, si je voulais faire la chose ci-dessus, je ferais quelque chose comme ceci:
select ID, Region, sum(count) as Total_Numbers
from df
group by ID, Region
order by ID, Region
Comme nous le voyons, il est très facile pour moi de renommer la variable agrégée 'count' en Total_Numbers in SQL. Je voulais faire la même chose dans Pandas mais incapable de trouver une telle option dans la fonction de regroupement par groupe. Quelqu'un peut-il aider?
2) La deuxième question et plus d'une observation est qu'il est possible d'utiliser directement les noms de colonne dans Pandas dataframe sans les inclure entre guillemets? Je comprends que les noms de variable sont chaîne, doit donc être entre guillemets, mais je vois si nous utilisons la fonction dataframe en dehors et comme attribut, nous n’exigeons pas qu’ils soient entre guillemets. Comme df.ID.sum (), etc. sort () ou df.groupby nous devons l’utiliser entre guillemets, c’est un peu pénible, comme en SQL ou en SAS ou d’autres langages, nous utilisons simplement le nom de la variable sans les citer. Une suggestion à ce sujet?
Veuillez suggérer les deux points ci-dessus (1er un principal, 2e plus d'un avis).
Merci
Pour la première question, je pense que la réponse serait:
<your DataFrame>.rename(columns={'count':'Total_Numbers'})
ou
<your DataFrame>.columns = ['ID', 'Region', 'Total_Numbers']
Quant à la seconde, je dirais que la réponse serait non. Il est possible de l'utiliser comme 'df.ID' à cause de modèle de données python :
Les références d'attribut sont traduites en recherches dans ce dictionnaire, par exemple, m.x est équivalent à m. dict ["x"]
La méthode actuelle (à partir de la version 0.20) pour modifier les noms de colonne après une opération groupby consiste à chaîner la méthode rename
. Voir cette note de dépréciation dans la documentation pour plus de détails.
Ceci est le premier résultat dans google et bien que la réponse principale fonctionne, elle ne répond pas vraiment à la question. Il y a un meilleure réponse ici et un long discussion sur github à propos de la fonctionnalité complète de la transmission de dictionnaires à la méthode agg
.
Ces réponses n'existent malheureusement pas dans la documentation, mais le format général de regroupement, agrégation puis renommage de colonnes utilise un dictionnaire de dictionnaires. Les clés du dictionnaire externe sont des noms de colonne à agréger. Les dictionnaires internes ont des clés que la nouvelle colonne nomme avec des valeurs comme fonction d'agrégation.
Avant d’y arriver, créons un DataFrame à quatre colonnes.
df = pd.DataFrame({'A' : list('wwwwxxxx'),
'B':list('yyzzyyzz'),
'C':np.random.Rand(8),
'D':np.random.Rand(8)})
A B C D
0 w y 0.643784 0.828486
1 w y 0.308682 0.994078
2 w z 0.518000 0.725663
3 w z 0.486656 0.259547
4 x y 0.089913 0.238452
5 x y 0.688177 0.753107
6 x z 0.955035 0.462677
7 x z 0.892066 0.368850
Supposons que nous voulions grouper par colonnes A, B
Et la colonne agrégée C
avec mean
et median
et la colonne agrégée D
avec max
. Le code suivant ferait ceci.
df.groupby(['A', 'B']).agg({'C':['mean', 'median'], 'D':'max'})
D C
max mean median
A B
w y 0.994078 0.476233 0.476233
z 0.725663 0.502328 0.502328
x y 0.753107 0.389045 0.389045
z 0.462677 0.923551 0.923551
Cela renvoie un DataFrame avec un index hiérarchique. La question initiale visait à renommer les colonnes en une seule et même étape. Ceci est possible en utilisant un dictionnaire de dictionnaires:
df.groupby(['A', 'B']).agg({'C':{'C_mean': 'mean', 'C_median': 'median'},
'D':{'D_max': 'max'}})
D C
D_max C_mean C_median
A B
w y 0.994078 0.476233 0.476233
z 0.725663 0.502328 0.502328
x y 0.753107 0.389045 0.389045
z 0.462677 0.923551 0.923551
Cela permet de renommer les colonnes en une fois, tout en conservant l'index hiérarchique auquel le niveau supérieur peut être supprimé avec df.columns = df.columns.droplevel(0)
.