2012-06-12 46 views
5

Tôi có một Multindex DataFrame với cấu trúc sau:lập chỉ mục một gấu trúc DataFrame

 0  1  2  ref 
A B    
21 45 0.01 0.56 0.23 0.02 
22 45 0.30 0.88 0.53 0.87 
23 46 0.45 0.23 0.90 0.23 

Những gì tôi muốn làm gì với nó là:
Từ cột [0: 2] chọn giá trị gần nhất với cột 'ref', vì vậy kết quả dự kiến ​​sẽ là:

 closest 
A B    
21 45 0.01 
22 45 0.88 
23 46 0.23 

Trả lời

4

Tái bạn DataFrame:

In [1]: index = MultiIndex.from_tuples(zip([21,22,23],[45,45,46]), names=['A', 'B']) 
In [2]: df = DataFrame({0:[0.01, 0.30, 0.45], 
         1:[0.56, 0.88, 0.23], 
         2:[0.23, 0.53, 0.90], 
         'ref': [0.02, 0.87, 0.23]}, index=index) 
In [3]: df 
Out[3]: 
     0  1  2 ref 
A B       
21 45 0.01 0.56 0.23 0.02 
22 45 0.30 0.88 0.53 0.87 
23 46 0.45 0.23 0.90 0.23 

tôi lần đầu tiên sẽ nhận được khoảng cách tuyệt đối của cột 0, 12 từ ref:

In [4]: dist = df[[0,1,2]].sub(df['ref'], axis=0).apply(np.abs) 
In [5]: dist 
Out[5]: 
     0  1  2 
A B     
21 45 0.01 0.54 0.21 
22 45 0.57 0.01 0.34 
23 46 0.22 0.00 0.67 

Với nay dist bạn có thể xác định các cột với các giá trị min bởi hàng sử dụng DataFrame.idxmin:

In [5]: idx = dist.idxmin(axis=1) 
In [5]: idx 
Out[5]: 
A B 
21 45 0 
22 45 1 
23 46 1 

Để tạo closest mới, bạn chỉ cần sử dụng idx để lập chỉ mục df:

In [6]: df['closest'] = idx.index.map(lambda x: df.ix[x][idx.ix[x]]) 
In [7]: df 
Out[7]: 
     0  1  2 ref closest 
A B         
21 45 0.01 0.56 0.23 0.02  0.01 
22 45 0.30 0.88 0.53 0.87  0.88 
23 46 0.45 0.23 0.90 0.23  0.23 

Bước cuối cùng, có thể có một cách thanh lịch hơn để làm điều đó nhưng tôi khá mới với Pandas và đó là điều tốt nhất tôi có thể nghĩ ngay bây giờ.

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