什么是pandas.Panel弃用警告实际推荐?

时间:2018-01-28 01:21:43

标签: python pandas numpy dataframe python-xarray

我有一个包使用pandas面板来生成MultiIndex pandas DataFrames。但是,每当我使用pandas.Panel时,我都会得到以下DeprecationError:

  

DeprecationWarning:   Panel已弃用,将在以后的版本中删除。   表示这些类型的三维数据的推荐方法是通过Panel.to_frame()方法在DataFrame上使用MultiIndex。   或者,您可以使用xarray包http://xarray.pydata.org/en/stable/。       Pandas提供.to_xarray()方法来帮助自动化转换。

但是,我无法理解这里的第一个推荐实际建议是为了创建MultiIndex DataFrames。如果要删除Panel,我将如何使用Panel.to_frame?

澄清:我不是在问什么弃用,或者如何将我的Panel转换为DataFrames。我要问的是,如果我在库中使用pandas.Panel然后使用pandas.Panel.to_frame从3D ndarrays创建MultiIndex DataFrames,并且不推荐使用Panels,那么制作这些DataFrames的最佳选择是什么使用Panel API?

例如,如果我正在执行以下操作,将X作为具有形状(N,J,K)的ndarray:

p = pd.Panel(X, items=item_names, major_axis=names0, minor_axis=names1)
df = p.to_frame()

这显然不再是DataFrame构建的可行的面向未来的选项,尽管它是this question中推荐的方法。

1 个答案:

答案 0 :(得分:7)

考虑以下小组:

data = np.random.randint(1, 10, (5, 3, 2))
pnl = pd.Panel(
    data, 
    items=['item {}'.format(i) for i in range(1, 6)], 
    major_axis=[2015, 2016, 2017], 
    minor_axis=['US', 'UK']
)

如果将其转换为DataFrame,则会变为:

             item 1  item 2  item 3  item 4  item 5
major minor                                        
2015  US          9       6       3       2       5
      UK          8       3       7       7       9
2016  US          7       7       8       7       5
      UK          9       1       9       9       1
2017  US          1       8       1       3       1
      UK          6       8       8       1       6

因此它将主轴和次轴作为行MultiIndex,将项目作为列。形状变为(6,5),最初是(5,3,2)。由您决定使用MultiIndex,但如果您想要完全相同的形状,则可以执行以下操作:

data = data.reshape(5, 6).T
df = pd.DataFrame(
    data=data,
    index=pd.MultiIndex.from_product([[2015, 2016, 2017], ['US', 'UK']]),
    columns=['item {}'.format(i) for i in range(1, 6)]
)

产生相同的DataFrame(如果要为索引命名,请使用names pd.MultiIndex.from_product参数):

         item 1  item 2  item 3  item 4  item 5
2015 US       9       6       3       2       5
     UK       8       3       7       7       9
2016 US       7       7       8       7       5
     UK       9       1       9       9       1
2017 US       1       8       1       3       1
     UK       6       8       8       1       6

现在使用pnl['item1 1'](可选df['item 1'])代替df['item 1'].unstack();您使用pnl.xs(2015)代替df.xs(2015)代替pnl.xs('US', axis='minor')而不是df.xs('US', level=1),而使用@Bean(name = "containerCustomizer") public EmbeddedServletContainerCustomizer containerCustomizer() { return (container -> ((JettyEmbeddedServletContainerFactory) container).addServerCustomizers( new JettyServerCustomizer() { @Override public void customize(Server server) { // HTTP ServerConnector connector = new ServerConnector(server); connector.setPort(80); // HTTPS SslContextFactory sslContextFactory = new SslContextFactory(); sslContextFactory.setKeyStorePath( getClass().getClassLoader().getResource("keystore.jks").getFile()); sslContextFactory.setKeyStorePassword("password"); HttpConfiguration https = new HttpConfiguration(); https.addCustomizer(new SecureRequestCustomizer()); ServerConnector sslConnector = new ServerConnector(server, new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1 .asString()), new HttpConnectionFactory(https)); sslConnector.setPort(443); server.setConnectors(new Connector[] {connector, sslConnector}); } })); }

如您所见,这只是将您最初的3D numpy数组重塑为2D的问题。您可以在MultiIndex的帮助下添加其他(人工)维度。