我在使用pandas面板时试图理解这种奇怪的行为。如果我沿着面板的major_axis或minor_axis取平均值,则轴似乎会被交换。
>>> panel = pd.Panel(np.random.rand(10,20,30))
>>> print(panel.mean(axis=0))
(20, 30)
>>> print(panel.mean(axis=1))
(30, 10)
>>> print(panel.mean(axis=2))
(20, 10)
我原以为在最后两个中,输出形状应分别为(10,30)和(10,20)。这是一个3D-numpy数组的工作原理,但是pandas Panel和numpy数组之间可能存在一些概念上的区别,我没有...
这是正确的行为吗?有人可以解释为什么会这样吗?
答案 0 :(得分:0)
将DataFrame
视为Series
的集合会很有用,其中每个Series
都是DataFrame
中的一列。
当您沿着axis=1
取平均值时,Series
的10个项目中的每一个都会获得包含30个元素的Panel
。如果您收集这10个Series
,则会获得包含30行和10列的DataFrame
。
同样,当您沿着axis=2
取平均值时,您最终会在面板中的10个项目中找到长度为20的Series
。将这10个Series
收集在一起会为您提供一个包含20行和10列的DataFrame
。
当您计算axis=0
的平均值时,您将获得平均项目,该项目预计与面板中的每个项目具有相同的形状,即20 x 30。
下面的一些代码可能有助于阐明我的观点:
In [1]: panel = pd.Panel(np.random.rand(10,20,30))
# Note that for a single item in the panel, the mean along
# either of its axes is a `Series`:
In [2]: type(panel[0].mean(axis=0))
Out[2]: pandas.core.series.Series
In [3]: type(panel[0].mean(axis=0))
Out[3]: pandas.core.series.Series
In [3]: panel[0].mean(axis=0)
Out[3]:
0 0.569390
1 0.497762
2 0.616333
3 0.608153
4 0.524008
5 0.478621
6 0.492827
7 0.461240
8 0.573557
9 0.654757
10 0.541066
11 0.572929
12 0.482214
13 0.576898
14 0.362965
15 0.493355
16 0.491790
17 0.567756
18 0.426404
19 0.514235
20 0.416983
21 0.455843
22 0.603592
23 0.387520
24 0.470060
25 0.506414
26 0.545156
27 0.525211
28 0.526378
29 0.486419
dtype: float64
答案 1 :(得分:0)
在这里讨论GitHub:https://github.com/pydata/pandas/issues/8906
我建议你签出XRay - 它建立在pandas之上,用于> = 3维数据