2012-06-12 4 views
5

У меня есть MULTINDEX DataFrame со следующей структурой:индексация панд 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 

То, что я хочу сделать с ним:
Из колонок [0: 2] выбрать наиболее близкое значение к колонку 'ссылка', так что ожидаемый результат будет:

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

ответ

4

Реконструировать ваш 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 

Я бы сначала получить абсолютное расстояние колонок 0, 1 и 2 от 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 

Учитывая Теперь dist вы можете определить столбец со значением мин построчно с помощью 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 

Чтобы создать новый closest, вам просто нужно использовать idx для индексирования 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 

Для последнего шага, может быть более элегантный способ сделать это, но я относительно новым для панд, и это лучшее, что я могу думать прямо сейчас.

Смежные вопросы