Question: def stack_plot(data, xtick, col2='project_is_approved', col3='total'): ind = np.arange(data.shape[0]) plt.figure(figsize=(20,5)) p1 = plt.bar(ind, data[col3].values) p2 = plt.bar(ind, data[col2].values) plt.ylabel('Projects') plt.title('Number of projects aproved vs rejected') plt.xticks(ind, list(data[xtick].values)) plt.legend((p1[0], p2[0]), ('total', 'accepted')) plt.show() def univariate_barplots(data, col1, col2='project_is_approved', top=False): # Count number of zeros in dataframe python: https://stackoverflow.com/a/51540521/4084039 temp = pd.DataFrame(project_data.groupby(col1)[col2].agg(lambda x: x.eq(1).sum())).reset_index() # Pandas dataframe grouby count: https://stackoverflow.com/a/19385591/4084039 temp['total'] = pd.DataFrame(project_data.groupby(col1)[col2].agg({'total':'count'})).reset_index()['total'] temp['Avg'] = pd.DataFrame(project_data.groupby(col1)[col2].agg({'Avg':'mean'})).reset_index()['Avg'] temp.sort_values(by=['total'],inplace=True, ascending=False) if top: temp = temp[0:top] stack_plot(temp, xtick=col1, col2=col2, col3='total') print(temp.head(5)) print("="*50) print(temp.tail(5)) univariate_barplots(project_data, 'school_state', 'project_is_approved', False)  Error: SpecificationError Traceback (most recent call last) <ipython-input-21-2cace8f16608> in <module>() ----> 1 univariate_barplots(project_data, 'school_state', 'project_is_approved', False) <ipython-input-20-856fcc83737b> in univariate_barplots(data, col1, col2, top) 4 5 # Pandas dataframe grouby count: https://stackoverflow.com/a/19385591/4084039 ----> 6 temp['total'] = pd.DataFrame(project_data.groupby(col1)[col2].agg({'total':'count'})).reset_index()['total'] 7 print (temp['total'].head(2)) 8 temp['Avg'] = pd.DataFrame(project_data.groupby(col1)[col2].agg({'Avg':'mean'})).reset_index()['Avg'] ~\AppData\Roaming\Python\Python36\site-packages\pandas\core\groupby\generic.py in aggregate(self, func, *args, **kwargs) 251 # but not the class list / tuple itself. 252 func = _maybe_mangle_lambdas(func) --> 253 ret = self._aggregate_multiple_funcs(func) 254 if relabeling: 255 ret.columns = columns ~\AppData\Roaming\Python\Python36\site-packages\pandas\core\groupby\generic.py in _aggregate_multiple_funcs(self, arg) 292 # GH 15931 293 if isinstance(self._selected_obj, Series): --> 294 raise SpecificationError("nested renamer is not supported") 295 296 columns = list(arg.keys()) SpecificationError: **nested renamer is not supported** 

Answer: In this specific case you can change temp['total'] = pd.DataFrame(project_data.groupby(col1)[col2].agg({'total':'count'})).reset_index()['total'] temp['Avg'] = pd.DataFrame(project_data.groupby(col1)[col2].agg({'Avg':'mean'})).reset_index()['Avg']  to the new syntax temp['total'] = pd.DataFrame(project_data.groupby(col1)[col2].agg(total='count')).reset_index()['total'] temp['Avg'] = pd.DataFrame(project_data.groupby(col1)[col2].agg(Avg='mean')).reset_index()['Avg']  New syntax: df.groupby( [columns] ).agg( new_column_name=("column", aggregation_function) )  The reason for this is that the new pandas version named aggregation is the recommended replacement for the deprecated dict-of-dicts approach to naming the output of column-specific aggregations (Deprecate groupby.agg() with a dictionary when renaming). source: https://pandas.pydata.org/pandas-docs/stable/whatsnew/v0.25.0.html