2013-11-14 12 views
15

Tôi có một khung dữ liệu mà Im tải từ tệp csv và sau đó đặt chỉ mục thành vài cột của nó (thường là hai hoặc ba) theo phương pháp set_index. Ý tưởng là để sau đó phần truy cập của dataframe sử dụng một số tổ hợp phím, như vậy:Phân loại Multi-Index thành độ sâu đầy đủ (Pandas)

df.set_index(['fileName','phrase']) 
df.ix['somePath','somePhrase'] 

Appearntly, kiểu này lựa chọn với nhiều phím duy nhất là có thể nếu Multi-Index của dataframe được sắp xếp để đủ chiều sâu . Trong trường hợp này, vì im cung cấp hai khóa, thao tác .ix sẽ không chỉ thất bại nếu chỉ mục đa dataframe được sắp xếp theo chiều sâu ít nhất 2.

vì một số lý do, khi Im thiết lập chỉ mục như được hiển thị, trong khi tôi có vẻ như cả hai lớp được sắp xếp, gọi df.index.lexsort_depth lệnh trả về 1 và tôi nhận được lỗi sau khi cố truy cập bằng hai khóa: MultiIndex lexsort depth 1, key was length 2

Bất kỳ trợ giúp nào?

Trả lời

11

Nó không thực sự rõ ràng những gì bạn đang yêu cầu. docs Multi-index là here

Các OP cần phải thiết lập các chỉ số, sau đó sắp xếp ở vị trí

df.set_index(['fileName','phrase'],inplace=True) 
df.sortlevel(inplace=True) 

Sau đó truy cập vào các mức thông qua một tuple để có được một kết quả cụ thể

df.ix[('somePath','somePhrase')] 

Có lẽ chỉ đưa ra một ví dụ đồ chơi như thế này và cho thấy tôi muốn có được một kết quả cụ thể.

In [1]: arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']) 
    ...: .....: , 
    ...: .....:   np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']) 
    ...: .....:   ] 

In [2]: df = DataFrame(randn(8, 4), index=arrays) 

In [3]: df 
Out[3]: 
       0   1   2   3 
bar one 1.654436 0.184326 -2.337694 0.625120 
    two 0.308995 1.219156 -0.906315 1.555925 
baz one -0.180826 -1.951569 1.617950 -1.401658 
    two 0.399151 -1.305852 1.530370 -0.132802 
foo one 1.097562 0.097126 0.387418 0.106769 
    two 0.465681 0.270120 -0.387639 -0.142705 
qux one -0.656487 -0.154881 0.495044 -1.380583 
    two 0.274045 -0.070566 1.274355 1.172247 

In [4]: df.index.lexsort_depth 
Out[4]: 2 

In [5]: df.ix[('foo','one')] 
Out[5]: 
0 1.097562 
1 0.097126 
2 0.387418 
3 0.106769 
Name: (foo, one), dtype: float64 

In [6]: df.ix['foo'] 
Out[6]: 
      0   1   2   3 
one 1.097562 0.097126 0.387418 0.106769 
two 0.465681 0.270120 -0.387639 -0.142705 

In [7]: df.ix[['foo']] 
Out[7]: 
       0   1   2   3 
foo one 1.097562 0.097126 0.387418 0.106769 
    two 0.465681 0.270120 -0.387639 -0.142705 

In [8]: df.sortlevel(level=1) 
Out[8]: 
       0   1   2   3 
bar one 1.654436 0.184326 -2.337694 0.625120 
baz one -0.180826 -1.951569 1.617950 -1.401658 
foo one 1.097562 0.097126 0.387418 0.106769 
qux one -0.656487 -0.154881 0.495044 -1.380583 
bar two 0.308995 1.219156 -0.906315 1.555925 
baz two 0.399151 -1.305852 1.530370 -0.132802 
foo two 0.465681 0.270120 -0.387639 -0.142705 
qux two 0.274045 -0.070566 1.274355 1.172247 

In [10]: df.sortlevel(level=1).index.lexsort_depth 
Out[10]: 0 
+0

Tôi nghĩ tôi đã rõ ràng. Tôi đã thấy tài liệu bạn đã liên kết đến rồi, nó không giúp được gì. vấn đề bắt đầu khi bạn cố gắng acess một hàng cụ thể với khóa của nó. Nếu chỉ mục không được sắp xếp theo tất cả các cấp, bạn sẽ gặp lỗi. câu hỏi là làm thế nào để sắp xếp chỉ mục ở tất cả các cấp độ – idoda

+0

chỉ '' df.sortlevel() '' – Jeff

+0

Tôi đã làm, nó không hoạt động đúng. khi tôi phân loại bởi 'fileName', chỉ số bên ngoài được sắp xếp, một bên trong ('cụm từ') được trộn lẫn. khi tôi sắp xếp theo 'cụm từ' lớp bọc ngoài ('tên tệp') được trộn lẫn, trong khi cấp độ bên trong được sắp xếp. Trong cả hai trường hợp, độ sâu phân loại là 1, điều này ngăn cản tôi truy cập vào df bằng hai khóa. Tôi cần một số cách để sắp xếp chỉ mục bên ngoài và ** sau đó ** sắp xếp chỉ mục bên trong mà không thay đổi thứ tự của chỉ mục bên ngoài. tức là - tôi cần hai lớp sắp xếp. – idoda

4

Tôi nhận ra một số thời gian đã trôi qua nhưng tôi dường như đã có cùng một vấn đề như @idoda đã làm, với câu trả lời chấp nhận không làm việc trên dataframes MultiIndex khi dataframes có thể có nhiều chỉ số trên cả hai cột và chỉ số. Bí quyết, hiện không được hiển thị ở đây, là có một tùy chọn "trục" mà mặc định là zero nhưng cũng có thể được thiết lập để 1.

Ví dụ, nếu bạn cố gắng:

df.sortlevel(inplace=True,sort_remaining=True) 

Và vẫn nhận được lỗi lexsort nó có thể có liên quan để biết rằng họ là một mặc định "trục = 0" kwarg trong đó. Do đó, bạn cũng có thể thử thêm

df.sortlevel(axis=1,inplace=True,sort_remaining=True) 

Nên phân loại hướng khác. Nếu bạn không muốn suy nghĩ về điều đó, bạn chỉ có thể gây sức ép với:

df.sortlevel(axis=0,inplace=True,sort_remaining=True) 
df.sortlevel(axis=1,inplace=True,sort_remaining=True) 

Điều đó hoàn toàn sắp xếp cả cột và chỉ mục hàng ở tất cả các cấp. Tôi đã có cùng một vấn đề ở đây và không thể có được một lexsort đầy đủ với câu trả lời được đề xuất nhưng một chút nghiên cứu cho thấy rằng ngay cả với "sort_remaining" True sortlevel chỉ áp dụng cho một trục duy nhất. Các đoạn mã này là giải pháp cho câu trả lời có vẻ là câu trả lời nguyên gốc của hiện tại. Hy vọng ai đó thấy nó hữu ích!

0

Pandas cung cấp:

d = d.sort_index() 
print d.index.is_lexsorted() # Sometimes true 

mà sẽ làm những gì bạn muốn trong hầu hết các trường hợp. Tuy nhiên, luôn luôn sắp xếp chỉ mục, nhưng có thể để nó 'lexsorted' (ví dụ, nếu bạn có NAN trong chỉ mục), trong đó generates a PerformanceWarning.

Để tránh điều này:

d = d.sort_index(level=d.index.names) 
print d.index.is_lexsorted() # true 

... mặc dù lý do tại sao có sự khác biệt dường như không được ghi lại.

Các vấn đề liên quan