2017-01-28 2 views
1

Problem Versuch eines groupby auf einem einfachen dataframe (downloadable csv) und dann agg, um Aggregatwerte für Spalten (Größe, Summe, Mittelwert, Standardabweichung) zurückzugeben. Was wie ein einfaches Problem aussieht, ist ein unerwartet schwieriger Fehler.Pandas groupby agg mit mehreren Funktionen, um Fehler anzuwenden

Top15.groupby('Continent')['Pop Est'].agg(np.mean, np.std...etc) 
# returns 
ValueError: No axis named <function std at 0x7f16841512f0> for object type <class 'pandas.core.series.Series'> 

Was ich versuche, ist ein df mit Index auf Kontinente und Spalten ['size', 'sum', 'mean', 'std']

Beispielcode

import pandas as pd 
import numpy as np 

# Create df 
df = pd.DataFrame({'Country':['Australia','China','America','Germany'],'Pop Est':['123','234','345','456'],'Continent':['Asia','Asia','North America','Europe']}) 

# group and agg 
df = df.groupby('Continent')['Pop Est'].agg('size','sum','np.mean','np.std') 
+3

Die Syntax lautet 'agg ([np.mean, np.std, ...]) '. –

+0

@IgorRaush Ich habe das ausprobiert und bekomme einen 'DataError: Keine numerischen Typen zu aggregieren', was komisch ist, wenn ich mir den Datenframe ansehe, es ist klar, dass da Daten sind. – Adestin

+2

Ihre Beispieldaten enthalten die Spalte 'Pop Est' als Zeichenfolgen, keine numerischen Daten. Deshalb erhalten Sie den Fehler. Probieren Sie 'df ['Pop Est'] = pd.to_numeric (df ['Pop Est'])' oder 'df ['Pop Est'] = df ['Pop Est']. Astype (int)' vor der Ausführung des ' groupby', unter Verwendung der von Igor erwähnten Syntax. – root

Antwort

3

Sie können auf numerische Werte nur Aggregatgröße und Summe gesetzt zu bekommen, so Wenn Sie Ihren Datenrahmen erstellen, geben Sie Ihre Zahlen nicht als Stiche ein:

df = pd.DataFrame({'Country':['Australia','China','America','Germany'],'PopEst':[123,234,345,456],'Continent':['Asia','Asia','North America','Europe']}) 

Ich denke, dass Sie bekommen, was Sie wollen?

grouped = df.groupby('Continent') 
grouped['PopEst'].agg(['size','sum','mean','std']) 


size sum mean std 
Continent    
Asia 2 357 178.5 78.488853 
Europe 1 456 456.0 NaN 
North America 1 345 345.0 NaN 
+0

Wenn ich Ihre Syntax verwende, bekomme ich immer noch ein DataError: Keine numerischen Typen zu aggregieren. Wenn ich jedoch nur die "Größen" -Methode verwende, funktionieren die Dinge gut. Ich habe bestätigt, dass die Pop Est-Spalte in meinem ursprünglichen Datensatz vom Typ Float ist. Interessanterweise fand ich Erfolg, indem ich die Pop Est-Spalte mit .astype (np.float64) umwandelte und dann Ihre Syntax verwendete. – Adestin

+0

Ich denke, das liegt daran, dass Sie "np.sum" anstelle von "sum" verwenden? – sparrow