pivot_table No hay tipos numéricos para agregar

Quiero hacer una tabla dinámica a partir del siguiente dataframe con columnas sales , rep . La tabla dinámica muestra las sales pero no rep . Cuando intenté con solo la rep , recibí el error DataError: No numeric types to aggregate . Cómo solucionar esto de tal manera que veo las sales campo numérico y el campo (cadena) rep

 data = {'year': ['2016', '2016', '2015', '2014', '2013'], 'country':['uk', 'usa', 'fr','fr','uk'], 'sales': [10, 21, 20, 10,12], 'rep': ['john', 'john', 'clair', '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 

Podrías usar set_index y unstack :

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

rendimientos

  rep sales year 2013 2014 2015 2016 2013 2014 2015 2016 country fr None kyle clair 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 

O, usando pivot_table con aggfunc='first' :

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

rendimientos

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

Con aggfunc='first' , cada grupo (country, year, rep) o (country, year, sales) se acumula tomando el primer valor encontrado. En su caso, parece que no hay duplicados, por lo que el primer valor es el mismo que el único valor.

Parece que el problema proviene de los diferentes tipos de representación de columna y ventas, si convierte las ventas a tipo str y especifica el conjunto como sum , funciona bien:

 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 clair None None 10 20 None # uk kyle None None john 12 None None 10 #usa None None None john None None None 21