2016-08-30 4 views
4

Я хочу сделать сводную таблицу из следующего фрейма данных с колонками sales, rep. Сводная таблица показывает sales, но не rep. Когда я пробовал только rep, я получил ошибку DataError: No numeric types to aggregate. Как исправить это такое, что я вижу, как числовое поле sales и поле (строка) reppivot_table Нет числовых типов для агрегирования

data = {'year': ['2016', '2016', '2015', '2014', '2013'], 
     'country':['uk', 'usa', 'fr','fr','uk'], 
     'sales': [10, 21, 20, 10,12], 
     'rep': ['john', 'john', 'claire', 'kyle','kyle'] 
     } 

print pd.DataFrame(data).pivot_table(index='country', columns='year', values=['rep','sales']) 

     sales    
year  2013 2014 2015 2016 
country      
fr  NaN 10 20 NaN 
uk   12 NaN NaN 10 
usa  NaN NaN NaN 21 


print pd.DataFrame(data).pivot_table(index='country', columns='year', values=['rep']) 
DataError: No numeric types to aggregate 
+0

Это зависит от того, что пытаются сделать. Функция agg по умолчанию является «средней», и вы не можете воспринимать среднее количество торговых представителей. Либо измените функцию agg, либо передайте другой столбец для значений. Если вы просто хотите использовать точку поворота, используйте pivot вместо pivot_table. – ayhan

ответ

13

Вы можете использовать set_index и unstack:

df = pd.DataFrame(data) 
df.set_index(['year','country']).unstack('year') 

урожаи

  rep      sales     
year  2013 2014 2015 2016 2013 2014 2015 2016 
country             
fr  None kyle claire None NaN 10.0 20.0 NaN 
uk  kyle None None john 12.0 NaN NaN 10.0 
usa  None None None john NaN NaN NaN 21.0 

Или , используя pivot_table с aggfunc='first':

df.pivot_table(index='country', columns='year', values=['rep','sales'], aggfunc='first') 

дает

  rep      sales     
year  2013 2014 2015 2016 2013 2014 2015 2016 
country             
fr  None kyle claire None None 10 20 None 
uk  kyle None None john 12 None None 10 
usa  None None None john None None None 21 

С aggfunc='first', каждый (country, year, rep) или (country, year, sales) группа aggregrated принимая первое найденное значение. В вашем случае, похоже, нет дубликатов, поэтому первое значение совпадает с единственным значением.

+1

set_index, его вуду, клянусь его вуду! – Merlin

1

Похоже, что проблема возникает из различных типов для столбца репутации и продаж, если преобразовать продажи в str типа и указать aggfunc как sum, он отлично работает:

df.sales = df.sales.astype(str) 

pd.pivot_table(df, index=['country'], columns=['year'], values=['rep', 'sales'], aggfunc='sum') 

#  rep       sales 
# year 2013 2014 2015 2016 2013 2014 2015 2016 
# country        
# fr None kyle claire None None  10  20 None 
# uk kyle None None john  12 None None 10 
#usa None None None john None None None 21 
Смежные вопросы