2013-10-22 12 views
24

1). Ich habe einen folgenden Beispiel-Datensatz:Umbenennen von Spaltennamen in Pandas Groupby Funktion

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

I Gruppe eine Region, die Beobachtungen dieses Datensatz von ID gesucht und für jede Gruppe die Zählung summiert werden. So habe ich so etwas wie diese:

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

Bei Verwendung as_index = False Ich bin in der Lage eine "Sql-Like" Ausgabe zu erhalten. Mein Problem ist, dass ich die Gesamtanzahl der Variablen hier nicht umbenennen kann. So in Sql, wenn die oben, was tun wollte ich so etwas tun würde:

select ID, Region, sum(count) as Total_Numbers 
from df 
group by ID,Region 
order by ID, Region 

Wie wir sehen, ist es sehr einfach für mich das aggregierte Variable ‚count‘ zu Total_Numbers in SQL umbenennen. Ich wollte dasselbe in Pandas machen, aber ich konnte keine solche Option in der groupby Funktion finden. Kann jemand helfen?

2). Die zweite Frage und mehr einer Beobachtung ist, dass es möglich ist, die Spaltennamen in der Pandas-Datenframe-Funktion direkt zu verwenden, ohne sie in Anführungszeichen einzuschließen? Ich verstehe, dass die Variablennamen String sind, also in Anführungszeichen gesetzt werden müssen, aber ich sehe, ob die Verwendung außerhalb des Datenrahmens funktioniert, und als Attribut brauchen wir sie nicht in Anführungszeichen zu setzen. Wie df.ID.sum() usw. Nur wenn wir es in einer DataFrame-Funktion wie df.sort() oder df.groupby verwenden, müssen wir es in Anführungszeichen setzen. Das ist eigentlich ein bisschen schmerzhaft, da wir in SQL oder in SAS oder einer anderen Sprache einfach den Variablennamen verwenden, ohne sie zu zitieren. Irgendwelche Vorschläge dazu?

Bitte schlagen Sie auf die oben genannten zwei Punkte (1. eine Haupt-, 2. mehr einer Meinung).

Dank

Antwort

28

Für die erste Frage denke ich Antwort wäre:

<your DataFrame>.rename(columns={'count':'Total_Numbers'}) 

oder

<your DataFrame>.columns = ['ID', 'Region', 'Total_Numbers'] 

Wie für die zweite, die ich die Antwort nein sein würde sagen würde. Es ist möglich, es zu benutzen, wie ‚df.ID‘ wegen python datamodel:

Attribut Verweise auf Lookups in diesem Wörterbuch übersetzt werden, zum Beispiel ist m.x zu m-Äquivalent. dict [ "x"]

+0

Thxs für die Antwort.Das Umbenennen half, außer dass ich in der ersten Syntax denke, wir müssen auch die Spalten = .. so .rename (columns = {'count': 'Total_Numbers' }). Andernfalls würde es für den Index benötigt und ändert den Spaltennamen nicht. Die zweite Sache funktioniert perfekt, aber wenn eine oder zwei Variablen umbenannt werden müssen, dann denke ich, dass die erste bequemer ist, anstatt alle Variablennamen in der zweiten Syntax zu erwähnen. Ich hatte gehofft, wenn es etwas in groupby gibt, aber sieht aus, als gäbe es das nicht. Auch ich verstehe pandas df ist ein Diktat intrinsisch. Wir hoffen auf etwas Flexibilität in Panda – Baktaawar

14

Der Strom (ab Version 0.20) Verfahren zur Spaltennamen nach einem groupby Wechselvorgang der Kette ist die rename Methode. Weitere Informationen finden Sie in der Dokumentation unter this deprecation note.

Veraltet Antwort als Pandas Version 0.20

Dies ist das erste Ergebnis in Google und obwohl die Top-Antwort funktioniert es nicht wirklich die Frage beantworten. Es gibt eine better answer here und eine lange discussion on github über die volle Funktionalität der Übergabe von Wörterbüchern an die agg-Methode.

Diese Antworten sind in der Dokumentation leider nicht vorhanden, aber das allgemeine Format zum Gruppieren, Aggregieren und anschließenden Umbenennen von Spalten verwendet ein Wörterbuch von Wörterbüchern. Die Schlüssel für das äußere Wörterbuch sind Spaltennamen, die aggregiert werden sollen.Die inneren Wörterbücher haben Schlüssel, die die neue Spalte mit Werten als aggregierende Funktion bezeichnet.

Bevor wir dort ankommen, erstellen wir einen vierspaltigen DataFrame.

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 

Lassen Sie uns sagen, dass wir durch Spalten A, B und Aggregatspalte C mit mean und median und Aggregatspalte D mit max gruppieren möchten. Der folgende Code würde dies tun.

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 

Dies gibt einen DataFrame mit einem hierarchischen Index zurück. Die ursprüngliche Frage wurde zum Umbenennen der Spalten im selben Schritt gestellt. Dies ist möglich, ein Wörterbuch der Wörterbücher mit:

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 

Diese benennt die Spalten in einem Rutsch, aber immer noch verlässt den hierarchischen Index, der die oberste Ebene mit df.columns = df.columns.droplevel(0) fallen gelassen werden.