我有12个相同形状的数据帧,可用于12年的数据收集。我需要使用它作为面板来绘制时间序列轴(年)上的各种列值。因此,我认为我应该将这些框架作为面板对齐。
一些示例数据:
# for 2015
Grave Crimes Cases Recorded Mistake of Law fact
Abduction 725 3
Kidnapping 246 6
Arson 466 1
Mischief 436 1
House Breaking 12707 21
Grievous Hurt 1299 3
# for 2016
Grave Crimes Cases Recorded Mistake of Law fact
Abduction 738 4
Kidnapping 297 9
Arson 486 4
Mischief 394 1
House Breaking 10287 14
Grievous Hurt 1205 0
# for 2017
Grave Crimes Cases Recorded Mistake of Law fact
Abduction 647 2
Kidnapping 251 10
Arson 418 3
Mischief 424 0
House Breaking 8913 12
Grievous Hurt 1075 1
答案 0 :(得分:1)
虽然面板允许添加尺寸,但层次索引是更常见的替代。例如,来自Python Data Science Handbook:
虽然Pandas确实提供了原生处理三维和四维数据的Panel和Panel4D对象(参见Aside:Panel Data),但实际上更常见的模式是利用层次索引(也称为多层)索引)在单个索引中合并多个索引级别。通过这种方式,可以在熟悉的一维系列和二维DataFrame对象中紧凑地表示高维数据。
在你的情况下
我有12个相同形状的数据帧,可用于12年的数据收集。我需要使用它作为面板来绘制时间序列轴(年)上的各种列值。
假设您的数据框位于df_2015
,df_2016
和df_2017
。您可以执行以下操作:
df_2015['year'] = 2015
df_2016['year'] = 2016
df_2017['year'] = 2017
df = pd.concat([df_2015, df_2016, df_2017]).set_index(['Grave Crimes', 'year'])
现在,要获取'Abduction'
所有年份的数据,请使用
df[df.index.get_level_values(0) == 'Abduction']
答案 1 :(得分:1)
假设您的DataFrame名称为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。考虑到这一点,Ami Tavory的方法将是更好的方法,因为数据结构更容易处理:
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)