2012-04-16 6 views
15

Tôi có Pandas Dataframe sau đây với một MultiIndex (Z, A):Chọn dữ liệu ở một mức độ cụ thể từ một MultiIndex

   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  

Câu hỏi: Làm thế nào tôi có thể chọn tất cả các mục có A = 203? Tôi đã thử sử dụng df[:,'A'] nhưng không hoạt động. Sau đó, tôi tìm thấy this trong tài liệu trực tuyến vì vậy tôi cố gắng:
df.xs(203,level='A')
nhưng tôi nhận được:
"TypeError: xs() got an unexpected keyword argument 'level'"
Ngoài ra tôi không thấy tham số này trong doc cài đặt (df.xs?):
"Parameters ---- ------ key: object Một số nhãn chứa trong chỉ mục hoặc một phần trong trục MultiIndex: int, mặc định 0 Trục để truy xuất mặt cắt ngang trên bản sao: boolean, mặc định Đúng Cho dù tạo bản sao của dữ liệu "
Lưu ý: Tôi có phiên bản phát triển.

Chỉnh sửa: Tôi tìm thấy this thread. Họ khuyên bạn nên sử dụng một cái gì đó như:

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

Tôi vẫn muốn biết điều gì đã xảy ra với df.xs với thông số cấp hoặc cách được khuyến nghị trong phiên bản hiện tại.

+0

Phiên bản bạn đang sử dụng? Rõ ràng là 'level' đã được thêm vào [version' 0.7.0'] (http://pandas.pydata.org/pandas-docs/dev/whatsnew.html#v-0-7-0-february-9-2012) . – Avaris

+0

Vâng rõ ràng đó là vấn đề, tôi đang ở trên 0.6.1, tôi đã cài đặt từ git nhưng bằng cách nào đó tôi vẫn còn trên 0.6.1, cảm ơn, tôi nên đóng câu hỏi, nếu có, làm thế nào? – elyase

+0

Bạn có thể viết câu trả lời với lý do giải quyết vấn đề và giải pháp thay thế và chấp nhận nó. – Avaris

Trả lời

7

Vấn đề nằm trong giả định của tôi (không chính xác) rằng tôi là trong phiên bản dev trong khi trên thực tế tôi đã 1.6.1, người ta có thể kiểm tra phiên bản cài đặt hiện tại với:

import pandas 
print pandas.__version__ 

trong phiên bản hiện tại df.xs() với thông số mức hoạt động ok.

4

Không phải là một trực tiếp câu trả lời cho câu hỏi, nhưng nếu bạn muốn chọn nhiều hơn một giá trị mà bạn có thể sử dụng "lát()" ký hiệu:

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