如果我在轴1(每一行)上的pandas DataFrame上调用apply(),我每次都会得到一个系列。然后我可以使用Series.name来访问当前行的索引值。
但是对于面板,沿着某个轴我每次都得到一个DataFrame并且没有DataFrame.name,我怎么知道我在应用的函数中的哪个索引?
我可以使用for循环,但由于各种原因我需要使用apply。
谢谢。
答案 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