Here is a solution for those who need to build graphs to study different levels of aggregation across groups across multiple columns.
from numpy.random import randint from numpy.random import randint import matplotlib.pyplot as plt import numpy as np levels_bool = np.tile(np.arange(0,2), 100) levels_groups = np.repeat(np.arange(0,4), 50) x_axis = np.tile(np.arange(0,10), 20) values = randint(0,10,200) stacked = np.stack((levels_bool, levels_groups, x_axis, values), axis=0) df = pd.DataFrame(stacked.T, columns=['bool', 'groups', 'x_axis', 'values']) columns = len(df['bool'].unique()) rows = len(df['groups'].unique()) fig, axs = plt.subplots(rows, columns, figsize = (20,20)) y_index_counter = count(0) groupped_df = df.groupby([ 'groups', 'bool','x_axis']).agg({ 'values': ['min', 'mean', 'median', 'max'] }) for group_name, grp in groupped_df.groupby(['groups']): y_index = next(y_index_counter) x_index_counter = count(0) for boolean, grp2 in grp.groupby(['bool']): x_index = next(x_index_counter) axs[y_index, x_index].plot(grp2.reset_index()['x_axis'], grp2.reset_index()['values'], label=str(key)+str(key2)) axs[y_index, x_index].set_title("Group:{} Bool:{}".format(group_name, boolean)) ax.legend() plt.subplots_adjust(hspace=0.5) plt.show()

source share