2017-01-28 3 views
1

Проблема попытке GroupBy на простом dataframe (загружаемый файл CSV), а затем AGG вернуть агрегированные значения для столбцов (размер, сумма, среднее, отклонение станд). Кажется, что простая проблема - это непредвиденная ошибка.Панды GroupBy AGG с множеством функций для применения возвращает ошибку

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

То, что я пытаюсь получить это ДФ с индексным множеством материков и столбцов ['size', 'sum', 'mean', 'std']

Пример кода

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

Синтаксис: 'agg ([np.mean, np.std, ...])'. –

+0

@IgorRaush Я пробовал это и получаю «DataError: нет числовых типов для агрегации», что является странным b/c, когда я смотрю на фреймворк данных, ясно, что есть данные. – Adestin

+2

Данные вашего примера имеют столбец «Pop Est» как строки, а не числовые данные, поэтому вы получаете ошибку. Попробуйте 'df ['Pop Est'] = pd.to_numeric (df ['Pop Est'])' или 'df ['Pop Est'] = df ['Pop Est']. Astype (int)' перед выполнением ' groupby', используя синтаксис, упомянутый Игорем. – root

ответ

3

Вы можете только совокупный размер и сумма числовых значений, так когда вы создаете свой фреймворк, не вводите свои номера в качестве укусов:

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

Я думаю, что это даст вам то, что вы хотите?

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

Когда я использую ваш синтаксис, я все равно получаю DataError: нет числовых типов для агрегирования. Однако, когда я просто использую метод «размер», все работает нормально. Я подтвердил, что столбец Pop Est в моем исходном наборе данных является типом float. Интересно, что я нашел успех, преобразовывая столбец Pop Est с .astype (np.float64), а затем используя ваш синтаксис. – Adestin

+0

Я думаю, это потому, что вы используете «np.sum» вместо «sum»? – sparrow

Смежные вопросы