【问题标题】:What is the pandas.Panel deprecation warning actually recommending?pandas.Panel 弃用警告实际上推荐的是什么?
【发布时间】:2018-07-07 00:38:33
【问题描述】:

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

弃用警告: 面板已弃用,将在未来版本中删除。 表示这些类型的 3 维数据的推荐方法是通过 Panel.to_frame() 方法在 DataFrame 上使用 MultiIndex。 或者,您可以使用 xarray 包 http://xarray.pydata.org/en/stable/。 Pandas 提供了一个.to_xarray() 方法来帮助自动完成这种转换。

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


澄清一下:我不是在问什么是弃用,或者如何将我的面板转换为 DataFrame。我要问的是,如果我在库中使用 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 中推荐的方法。

【问题讨论】:

  • 如果您现在Panel.to_frame(),您将不再拥有任何面板数据?
  • 这是一个包,而不是一个特定的数据集。当 Panel 被弃用时,初始的 Panel 生成将无法正常工作。
  • 我在问为什么这里推荐的替代方法是使用一种将被弃用的方法,尽管看起来我现在从 cmets 那里得到了答案。
  • 你在构建使用面板的API吗?或者你是在调用一些返回面板的代码吗?
  • 我已经在问题中澄清了这一点,抱歉 - 我都是从 3D ndarray 生成面板,然后将其转换为 DataFrame。

标签: python pandas numpy dataframe python-xarray


【解决方案1】:

考虑以下面板:

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(如果要命名索引,请使用 pd.MultiIndex.from_product 的 names 参数):

         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

现在你使用df['item 1'](可选df['item 1'].unstack())代替pnl['item1 1'];而不是pnl.xs(2015),你使用df.xs(2015),而不是pnl.xs('US', axis='minor'),你使用df.xs('US', level=1)。

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

【讨论】:

  • 啊,很好,我只是做了几乎完全相同的事情,但缺少转置,所以数字排列不正确!
  • @JohnE 是的,axis=0 变成了axis=1,to_frame 不是很直观。再一次,面板对我来说没有什么直观的。 :)
猜你喜欢
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多