Renommer les noms de colonne dans la fonction Pandas Groupby

1). J'ai l'exemple d'ensemble 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

j'ai voulu grouper les observations de cet ensemble de données par ID une région et la sommation du compte pour chaque groupe. Donc j'ai utilisé quelque chose comme ceci:

>>> 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 suis capable d'obtenir une sortie de type" SQL". Mon problème est que je ne suis pas en mesure de 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 ça:

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 en SQL. Je voulais faire la même chose dans Pandas mais je n'ai pas pu trouver une telle option dans group-by function. Quelqu'un peut-il aider?

2). La deuxième question et plus d'une observation est que est - il possible d'utiliser directement les noms de colonne dans la fonction de dataframe Pandas sans les enfermer entre guillemets? Je comprends que les noms de variables sont chaîne, ce qui a à être à l'intérieur des guillemets, mais je voir si l'utilisation à l'extérieur dataframe fonction et en tant qu'attribut nous n'avons pas besoin d'eux pour être à l'intérieur des guillemets. Comme df.ID.sum() etc. C'est seulement quand nous l'utilisons dans une fonction de DataFrame comme df.sort () ou df.groupby nous devons l'utiliser entre guillemets. Il s'agit en fait d'un peu de douleur comme en SQL ou en SAS ou d'autres langues, nous utilisons simplement le nom de la variable sans les citer. Toute suggestion à ce sujet?

suggérez sur les deux points ci-dessus (1er principale, 2ème plus d'une opinion).

Merci

36
demandé sur Er Bharath Ram 2013-10-22 20:23:05

2 réponses

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 Python datamodel :

les références D'attribut sont traduites pour les recherches dans ce dictionnaire, par exemple, M. x est équivalent à M. dict ["x"]

40
répondu Roman Pekar 2016-01-27 16:02:31

la méthode courante (à partir de la version 0.20) pour changer le nom des colonnes après une opération groupby est de enchaîner la méthode rename . Voir cette note de dépréciation dans la documentation pour plus de détails.

réponse dépréciée à partir de pandas version 0.20

c'est le premier résultat dans google et bien que la réponse supérieure fonctionne, il ne répond pas vraiment à la question. Il y a une meilleure réponse ici et un long discussion sur github à propos de l'ensemble des fonctionnalités de passer les dictionnaires pour les agg la méthode.

ces réponses n'existent malheureusement pas dans la documentation mais le format général pour grouper, agréger et ensuite renommer les colonnes utilise un dictionnaire de dictionnaires. Les clés du dictionnaire externe sont des noms de colonne qui doivent être agrégés. Les dictionnaires intérieurs ont des clés que la nouvelle colonne nomme avec valeurs de la fonction d'agrégation.

avant d'y arriver, créons une base de données à 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

disons que nous voulons Grouper par les colonnes A, B et agréger la colonne C avec mean et median et agréger la colonne D avec max . Le code suivant le ferait.

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

renvoie une base de données avec un index hiérarchique. Original question posée à propos de renommer les colonnes dans la même étape. Cela 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

ceci renomme les colonnes toutes en une seule fois mais laisse quand même l'index hiérarchique que le niveau supérieur peut être supprimé avec df.columns = df.columns.droplevel(0) .

17
répondu Ted Petrou 2017-05-23 12:02:51