将pandas数据框对齐为面板

时间:2018-04-27 04:52:17

标签: python pandas

我有12个相同形状的数据帧,可用于12年的数据收集。我需要使用它作为面板来绘制时间序列轴(年)上的各种列值。因此,我认为我应该将这些框架作为面板对齐。

  1. 有人可以帮我了解如何将数据框作为面板对齐吗?
  2. 这是准备沿第三维绘图的正确方法吗?
  3. enter image description here

    一些示例数据:

    # 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
    

2 个答案:

答案 0 :(得分:1)

虽然面板允许添加尺寸,但层次索引是更常见的替代。例如,来自Python Data Science Handbook

  

虽然Pandas确实提供了原生处理三维和四维数据的Panel和Panel4D对象(参见Aside:Panel Data),但实际上更常见的模式是利用层次索引(也称为多层)索引)在单个索引中合并多个索引级别。通过这种方式,可以在熟悉的一维系列和二维DataFrame对象中紧凑地表示高维数据。

在你的情况下

  

我有12个相同形状的数据帧,可用于12年的数据收集。我需要使用它作为面板来绘制时间序列轴(年)上的各种列值。

假设您的数据框位于df_2015df_2016df_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))

example of a 3D-plot of your data

但是,如果我可以从我自己的经验中给出一个关于良好可读数据可视化的提示,我认为很多专业人士会分享这些提示:

即使数据集是三维或更多维的结构,创建精心设计的二维图通常也是一个不错的选择。 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)

example for 2D-plot of your data