Pandas Panel适用:获取当前指数

时间:2017-01-14 23:03:09

标签: pandas

如果我在轴1(每一行)上的pandas DataFrame上调用apply(),我每次都会得到一个系列。然后我可以使用Series.name来访问当前行的索引值。

但是对于面板,沿着某个轴我每次都得到一个DataFrame并且没有DataFrame.name,我怎么知道我在应用的函数中的哪个索引?

我可以使用for循环,但由于各种原因我需要使用apply。

谢谢。

2 个答案:

答案 0 :(得分:1)

实际上,在Panel的情况下,名称仍然有效,它只返回一个元组:

wp = pd.Panel(np.random.randn(2, 5, 4), items=['Item1', 'Item2'],
                  major_axis=pd.date_range('1/1/2000', periods=5),
                  minor_axis=['A', 'B', 'C', 'D'])
wp.apply(lambda x: print(x.name))
在这种情况下,

x.name会产生:

('Item1', 'A')
('Item1', 'B')
('Item1', 'C')
('Item1', 'D')
('Item2', 'A')
('Item2', 'B')
('Item2', 'C')
('Item2', 'D')

所以你可以简单地解开元组并获取索引

答案 1 :(得分:1)

pn = pd.Panel(np.arange(27).reshape(3, 3, 3), list('abc'), list('xyz'), list('ijk'))
默认情况下,apply超过pd.Panel会迭代2-D横截面。这意味着它的名称必须从其他维度引用索引。

例如

pn.apply(lambda s: type(s))

('a', 'i')
('a', 'j')
('a', 'k')
('b', 'i')
('b', 'j')
('b', 'k')
('c', 'i')
('c', 'j')
('c', 'k')

但是,您可以告诉apply您希望在特定轴上进行迭代,以便将应用的函数应用于只有一个要跟踪的索引的pd.DataFrame。在这种情况下,您会遇到您所描述的问题。

相反,我会使用pd.Panel.iteritems。您可以通过我给出的示例中的item变量跟踪i名称。

for i, df in pn.iteritems():

    print(i, '\n')
    print(df, '\n')

a 

   i  j  k
x  0  1  2
y  3  4  5
z  6  7  8 

b 

    i   j   k
x   9  10  11
y  12  13  14
z  15  16  17 

c 

    i   j   k
x  18  19  20
y  21  22  23
z  24  25  26