web-dev-qa-db-fra.com

Renommer les noms de colonnes dans Pandas Fonction Groupby

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

42
Baktaawar

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"]

45
Roman Pekar

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.

Réponse obsolète à partir de pandas version 0.20

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).

23
Ted Petrou