Предполагая, что ваши DataFrames названы как df15, df16, df17, вы можете создать панель с ними как:
pnl = pd.Panel({2015: df15, 2016: df16, 2017: df17})
После этого вы можете сделать 3D-сюжет, упомянутый в вашем вопросе, следующим образом:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for i in range(2015, 2018):
ax.bar(pnl.major_axis.values, pnl[i]['Cases Recorded'], zdir='y', zs=i)
ax.yaxis.set_ticks(range(2015, 2018))
ax.yaxis.set_ticklabels(range(2015, 2018))
Однако, если я могу дать вам подсказку относительно хорошо читаемой визуализации данных из моего собственного опыта, которым, я думаю, поделятся многие профессионалы:
Даже если набор данных имеет трехмерную или более структурированную структуру, часто бывает хорошим выбором создать хорошо спроектированный двухмерный график. 3D часто привлекает внимание, но чтобы проинформировать целевую аудиторию и показать определенные свойства данных, вы почти сойдете с 2d. Имея это в виду, подход Ами Тавори был бы лучшим путем, поскольку структуру данных легче обрабатывать:
df15['year'] = 2015
df16['year'] = 2016
df17['year'] = 2017
df = pd.concat([df15, df16, df17]).set_index(['Grave Crimes', 'year'])
f, ax = plt.subplots(1)
for i, y in enumerate(range(2015, 2018)):
data = df.groupby('year').get_group(y)['Cases Recorded']
ax.bar(np.arange(6)+.2*i, data.values, width=.2, label=str(y))
ax.legend()
ax.set_xticklabels(data.index, rotation=15)