Pandas 使用xs与loc在0.15.2和;0.18.0

Pandas 使用xs与loc在0.15.2和;0.18.0,pandas,multi-index,Pandas,Multi Index,在具有多索引的DataFrame上使用.xs和.loc对数据子集进行切片的结果上的索引结构似乎在v0.15.2和0.18.0之间发生了变化。 请参考使用不同版本的Pandas在ipython笔记本中获得的代码片段和输出 import pandas as pd print 'pandas-version: ', pd.__version__ import numpy as np l1 = ['A', 'B', 'C', 'D'] l2 = sorted(['foo','bar','baz']) n

在具有多索引的DataFrame上使用.xs和.loc对数据子集进行切片的结果上的索引结构似乎在v0.15.2和0.18.0之间发生了变化。 请参考使用不同版本的Pandas在ipython笔记本中获得的代码片段和输出

import pandas as pd
print 'pandas-version: ', pd.__version__
import numpy as np
l1 = ['A', 'B', 'C', 'D']
l2 = sorted(['foo','bar','baz'])
nrows = len(l1) * len(l2)
s = pd.DataFrame(np.random.random( nrows * 2).reshape(nrows, 2),
                 index=pd.MultiIndex.from_product([l1, l2],
                                                 names=['one','two']))

# print s.index
l_all = slice(None)
# get all records matching 'foo' in level=1 using .loc
sub_loc = s.loc[(l_all, 'foo'),:]
print '.loc[(slice(None), "foo")] result:\n', sub_loc, 
print '\n.loc result-index:\n', sub_loc.index

# get all records matching 'foo' in level=1 using .xs()
sub_xs = s.xs('foo', level=1)
print '\n.xs(\'foo\', level=1) result:\n', sub_xs, 
print '\n .xs result index:\n', sub_xs.index
0.15.2输出 0.18.0输出 调用
sub_loc.index
似乎返回与原始数据帧对象相同的多索引结构(与v0.15.2不一致),但
sub_xs.index
似乎与早期版本一致


注意:我使用的是[Python 2.7.11 | Anaconda 1.8.0(64位)|(默认,2016年2月16日,09:58:36)[MSC v.1500 64位(AMD64)]

我认为这确实是一个bug,在更简单的设置中也会出现:


编辑:好吧,可能不是,因为我在错误中创建的示例在0.14.1中的行为相同。

对不起,忘了我的其他答案,我提交的错误完全无关

正确答案是:“索引结构”在两个版本之间没有改变。唯一改变的是打印索引时索引的表示方式

在这两种情况下,您都有一个多重索引,具有完全相同的级别和值。您可能对0.18.0中似乎包含“baz”和“bar”的事实感到困惑。但是,
多索引
可以有实际不使用的级别值,因为在本例中,它在创建时包含这些值,而在删除使用这些值的行时,不会消除未使用的级别值<0.15.2中的代码>子位置索引在
级别内也有“baz”和“bar”
,但打印时的表示方式不会显示这一点

顺便说一下,已经过滤的多索引是否仍然包含这样的“过时”标签是一个实现细节,您通常不应该关心它。换句话说,

MultiIndex(levels=[[u'A', u'B', u'C', u'D'], [u'bar', u'baz', u'foo']],
       labels=[[0, 1, 2, 3], [2, 2, 2, 2]],
       names=[u'one', u'two'])

实际上,在“在相同位置具有相同的值”的意义上,是完全相同的索引,因此当用于
系列
数据帧
之间的赋值时,其行为相同


(正如您现在可能已经很清楚的那样,
多索引的
标签
组件决定了实际使用的级别值以及位置。)

真正的不一致是在访问
子位置索引时,即使是打印
print sub_loc
的行为也似乎始终如一。谢谢@PietroBattiston,我已经过度关注了
标签的变化,只关注了
级别的值。
##########################
pandas-version:  0.18.0
.loc[(slice(None), "foo")] result:
                0         1
one two                    
A   foo  0.723213  0.532838
B   foo  0.736941  0.401252
C   foo  0.217131  0.044254
D   foo  0.712824  0.411026 
.loc result-index:
MultiIndex(levels=[[u'A', u'B', u'C', u'D'], [u'bar', u'baz', u'foo']],
           labels=[[0, 1, 2, 3], [2, 2, 2, 2]],
           names=[u'one', u'two'])

.xs('foo', level=1) result:
            0         1
one                    
A    0.723213  0.532838
B    0.736941  0.401252
C    0.217131  0.044254
D    0.712824  0.411026 
 .xs result index:
Index([u'A', u'B', u'C', u'D'], dtype='object', name=u'one')
MultiIndex(levels=[[u'A', u'B', u'C', u'D'], [u'bar', u'baz', u'foo']],
       labels=[[0, 1, 2, 3], [2, 2, 2, 2]],
       names=[u'one', u'two'])
MultiIndex(levels=[[u'A', u'B', u'C', u'D'], [u'foo']],
       labels=[[0, 1, 2, 3], [0, 0, 0, 0]],
       names=[u'one', u'two'])