15

我有以下带有 MultiIndex(Z,A) 的 Pandas 数据框:

             H1       H2  
   Z    A 
0  100  200  0.3112   -0.4197   
1  100  201  0.2967   0.4893    
2  100  202  0.3084   -0.4873   
3  100  203  0.3069   NaN        
4  101  203  -0.4956  NaN       

问题:如何选择 A=203 的所有项目?我试过df[:,'A'] 了,但它不起作用。然后我在在线文档中找到了这个,所以我尝试了:
df.xs(203,level='A')
但我得到:
TypeError: xs() got an unexpected keyword argument 'level'”我在安装的 doc( )
中也没有看到这个参数: “参数 ---------- key : object Some label contains in索引,或部分在 MultiIndex 轴:int,默认 0 轴以在复制时检索横截面:布尔值,默认 True 是否复制数据“ 注意:我有开发版本。df.xs?

编辑:我找到了这个线程。他们推荐类似的东西:

df.select(lambda x: x[1]==200, axis=0)  

我仍然想知道带有 level 参数的 df.xs 发生了什么,或者在当前版本中推荐的方式是什么。

4

2 回答 2

7

问题在于我的假设(不正确)我在开发版本中,而实际上我有 1.6.1,可以通过以下方式检查当前安装的版本:

import pandas
print pandas.__version__

在当前版本df.xs()中使用 level 参数可以正常工作。

于 2012-04-16T21:47:06.370 回答
4

不是对这个问题的直接回答,但如果您想选择多个值,您可以使用“slice()”表示法:

import numpy
from pandas import  MultiIndex, Series

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
              ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
tuples = list(zip(*arrays))
index = MultiIndex.from_tuples(tuples, names=['first', 'second'])
s = Series(numpy.random.randn(8), index=index)

In [10]: s
Out[10]:
first  second
bar    one       0.181621
       two       1.016225
baz    one       0.716589
       two      -0.353731
foo    one      -0.326301
       two       1.009143
qux    one       0.098225
       two      -1.087523
dtype: float64

In [11]: s.loc[slice(None)]
Out[11]:
first  second
bar    one       0.181621
       two       1.016225
baz    one       0.716589
       two      -0.353731
foo    one      -0.326301
       two       1.009143
qux    one       0.098225
       two      -1.087523
dtype: float64

In [12]: s.loc[slice(None), "one"]
Out[12]:
first
bar      0.181621
baz      0.716589
foo     -0.326301
qux      0.098225
dtype: float64

In [13]: s.loc["bar", slice(None)]
Out[13]:
first  second
bar    one       0.181621
       two       1.016225
dtype: float64
于 2014-12-13T00:02:21.893 回答