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