webentwicklung-frage-antwort-db.com.de

Spaltennamen in Pandas Groupby-Funktion umbenennen

1). Ich habe den folgenden Beispieldatensatz:

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

Ich wollte die Beobachtungen dieses Datensatzes nach ID und Region gruppieren und die Anzahl für jede Gruppe summieren. Also habe ich so etwas benutzt:

>>> 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 von as_index = False kann ich eine "SQL-ähnliche" Ausgabe erhalten. Mein Problem ist, dass ich die Gesamtvariablenzahl hier nicht umbenennen kann. Wenn ich also in SQL das obige tun wollte, würde ich so etwas tun:

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

Wie wir sehen, ist es für mich sehr einfach, die Aggregatvariable 'count' in SQL in Total_Numbers umzubenennen. Ich wollte dasselbe in Pandas aber ich konnte keine solche Option in der Gruppenfunktion finden. Kann jemand helfen?

2). Die zweite Frage und mehr einer Beobachtung ist, dass es möglich ist, die Spaltennamen in Pandas dataframe function direkt zu verwenden, ohne sie in Anführungszeichen zu setzen? Ich verstehe, dass die Variablennamen Zeichenfolgen sind, also müssen innerhalb von Anführungszeichen stehen, aber ich sehe, wenn Sie die Funktion für externe Datenrahmen verwenden und als Attribut benötigen Sie keine Anführungszeichen wie df.ID.sum () usw. Dies ist nur der Fall, wenn Sie diese Funktion in einer DataFrame-Funktion wie df verwenden. sort () oder df.groupwenn wir es in Anführungszeichen setzen müssen. Dies ist eigentlich ein bisschen mühsam wie in SQL oder in SAS oder anderen Sprachen, wir verwenden einfach den Variablennamen, ohne sie in Anführungszeichen zu setzen. Irgendwelche Vorschläge dazu?

Bitte schlagen Sie zu den beiden oben genannten Punkten vor (1. eine Haupt-, 2. mehr einer Meinung).

Vielen Dank

42
Baktaawar

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

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

oder

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

Zum zweiten würde ich sagen, die Antwort wäre nein. Es ist möglich, es wie 'df.ID' zu verwenden, da Python-Datenmodell :

Attributreferenzen werden in diesem Wörterbuch zu Nachschlägen übersetzt, z. B. ist m.x äquivalent zu m. dict ["x"]

45
Roman Pekar

Die aktuelle Methode (ab Version 0.20) zum Ändern von Spaltennamen nach einer groupby-Operation besteht darin, die Methode rename zu verketten. Weitere Informationen finden Sie in der Dokumentation unter dieser Hinweis zur Nichtbeachtung .

Veraltete Antwort ab pandas version 0.20

Dies ist das erste Ergebnis in Google und obwohl die Top-Antwort funktioniert, beantwortet sie die Frage nicht wirklich. Es gibt ein bessere Antwort hier und ein langes Diskussion über Github über die volle Funktionalität der Übergabe von Wörterbüchern an die Methode agg.

Diese Antworten sind leider nicht in der Dokumentation enthalten, aber das allgemeine Format zum Gruppieren, Aggregieren und Umbenennen von Spalten verwendet ein Wörterbuch mit Wörterbüchern. Die Schlüssel zum äußeren Wörterbuch sind Spaltennamen, die aggregiert werden sollen. Die inneren Wörterbücher haben Schlüssel, die die neuen Spaltennamen mit Werten als Aggregationsfunktion enthalten.

Bevor wir dahin kommen, 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

Angenommen, wir möchten die Spalten A, B Und die Spalte C mit mean und median gruppieren und die Spalte D mit max. 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 betraf das Umbenennen der Spalten im selben Schritt. Dies ist mit einem Wörterbuch von Wörterbüchern möglich:

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

Dadurch werden die Spalten auf einmal umbenannt, es bleibt jedoch der hierarchische Index erhalten, den die oberste Ebene mit df.columns = df.columns.droplevel(0) löschen kann.

23
Ted Petrou