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       

Question: How can I select all items with A=203? I tried df[:,'A'] but it doesn't work. Then I found this in the online documentation so I tried:
df.xs(203,level='A')
but I get:
"TypeError: xs() got an unexpected keyword argument 'level'"
Also I dont see this parameter in the installed doc(df.xs?):
"Parameters ---------- key : object Some label contained in the index, or partially in a MultiIndex axis : int, default 0 Axis to retrieve cross-section on copy : boolean, default True Whether to make a copy of the data"
Note:I have the development version.

Edit: I found this thread. They recommend something like:

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

I still would like to know what happened with df.xs with the level parameter or what is the recommended way in the current version.

4

2 に答える 2

7

問題は、実際には1.6.1を持っていたのに、私がdevバージョンにいたという私の仮定(間違った)にあります。現在インストールされているバージョンを次のように確認できます:

import pandas
print pandas.__version__

現在のバージョンdf.xs()では、レベル パラメータを使用しても問題なく動作します。

于 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 に答える