我有以下带有MultiIndex(Z,A)的Pandas Dataframe:
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']
,但它不起作用。然后我在在线文档中找到this,所以我尝试了:
df.xs(203,level='A')
但我明白了:
“TypeError: xs() got an unexpected keyword argument 'level'
”
此外,我在安装的文档(df.xs?
)中看不到此参数:
“参数---------- key:object索引中包含的某些标签,或者部分位于MultiIndex轴中:int,default 0用于检索复制的横截面的轴:boolean,default True是否为数据副本“
注意:我有开发版本。
编辑:我找到了this thread。他们建议像:
df.select(lambda x: x[1]==200, axis=0)
我仍然想知道df.xs使用level参数发生了什么,或者当前版本中推荐的方式是什么。
答案 0 :(得分:7)
问题在于我的假设(不正确),我在开发版本,而实际上我有1.6.1,可以检查当前安装的版本:
import pandas
print pandas.__version__
在当前版本df.xs()
中,level参数可以正常工作。
答案 1 :(得分: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