2016-02-27 5 views
2

Сядьте на dataframe, di, созданный:Правильный способ назначения данных на подмножества мультииндексированных кадра данных панд

import pandas as pd 

data = { 
    "Event": ['Biathlon', 'Ski Jump', 'Slalom', 'Downhill'], 
    "Award": ['Gold', 'Bronze', 'Gold', 'Silver'], 
    "Points": ['100', '10', '100', '40'], 
    "Rank": ['1', '3', '1', '2'] 
} 

d = pd.DataFrame(data) 
di = d.set_index(["Award","Event"]) 
print(di) 

Что бы быть надлежащим образом изменить значение точки для ('Bronze', 'Ski Jump') записи?

С помощью проб и ошибок я знаю, что, похоже, работает, хотя мне не ясно, из pandas documentation, что это приемлемый подход.

di.loc[('Bronze', 'Ski Jump'), 'Points'] = 20 

Так как бы вы справились? Можете ли вы указать мне на соответствующую документацию?

ответ

2

У вас все в порядке. Из indexing docs (курсив):

.loc в первую очередь этикетки на основе, но также могут быть использованы с логическим массивом.

При использовании .loc на DataFrame, синтаксис

df.loc[row_indexer,column_indexer]

Каждый из row_indexer и column_indexer может быть

  • Один ярлык [...]
  • список или массив меток ['a', 'b', 'c']
  • Объект ломтика с этикетками 'a':'f' [...]
  • Логическое массив

Вы используя первую пулю. Индекс строки - это мультииндекс, для которого метки являются кортежами. Индекс столбца - это простой индекс строки. Тогда выражение

di.loc[('Bronze', 'Ski Jump'), 'Points'] 

переводится как «получить значение, расположенное на ('Bronze', 'Ski Jump') вдоль ряда мультииндекса и в 'Points' по индексу столбца.» Это именно то, что вы хотели.


Еще один способ подумать об этом примере - забыть мультииндекс. От MultiIndex/Advanced Indexing:

Это стоит иметь в виду, что нет ничего мешает вам использовать кортежи как атомных меток на оси.

многоиндексной очень похож на простого индекса кортежа, хотя она обеспечивает расширенные функциональные возможности (например, можно использовать только индекс первого уровня, как di.loc['Bronze']).Тем не менее, вы можете создать фрейм данных как

df = pd.DataFrame([ 
    ['100', '1'], 
    ['10', '3'], 
    ['100', '1'], 
    ['40', '2'] 
], columns=['Points', 'Rank'], index=[ 
    ('Gold', 'Biathlon'), 
    ('Bronze', 'Ski Jump'), 
    ('Gold', 'Slalom'), 
    ('Silver', 'Downhill') 
]) 

Это делает его более очевидным, почему di.loc[('Bronze', 'Ski Jump'), 'Points'] действительный выбор этикетки.

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