#!/usr/bin/env python
# coding: utf-8

# ### Урок 6.5. Иерархическое индексирование
# 
# Создадим небольшой датасет, который содержит число переводов с английского на русский и с французского на русский для одного переводчика за каждый день:

# In[2]:


import pandas as pd
df = pd.DataFrame([['2019-03-11', 'en', 3],
                  ['2019-03-11', 'fr', 5],
                  ['2019-03-12', 'en', 6],
                  ['2019-03-13', 'fr', 1],
                  ['2019-03-13', 'en', 2],
                  ['2019-03-16', 'fr', 4],
                  ['2019-03-17', 'en', 3]], 
                  columns = ['date', 'lang', 'n'])


# In[3]:


df


# Ранее мы обсуждали, что при необходимости строки в датафрейме можно называть по какому-нибудь столбцу. Например, в качестве идентификатора строки вместо её номера использовать имя респондента или название страны. Однако в таком случае мы можем столкнуться с проблемой: идентификатор строки должен быть уникальным, то есть столбец, который мы используем в качестве названий, не должен содержать повторяющихся значений. 
# 
# Вернемся к нашему датасету: если мы захотим использовать в качестве идентификатора строки столбцы `date` или `lang`, ничего не получится: даты повторяются и языки тоже. Как быть? Использовать мульти-индекс – индекс строки, который будет состоять из пары значений (`date`-`lang`). Такая пара уже будет уникальной: 

# In[4]:


df.set_index(['date', 'lang'], inplace=True)


# In[5]:


df


# Посмотрим на то, как теперь выглят объект `Index`:

# In[6]:


df.index


# Почему такое индексирование называется иерархическим? Потому что теперь, при обращении к строке, нам нужно будет указывать двойной индекс: например, дату и язык, то есть внутри даты будут вложены языки – образуется некоторая иерархия, сложная структура:

# In[7]:


df.loc['2019-03-11'] # только фиксированная дата


# In[8]:


df.loc[('2019-03-11', 'en')]  # фиксированная дата и язык 


# По таким индексам также удобно сортировать строки:

# In[9]:


df.sort_index()  # сортировка по дате и языку (язык - по алфавиту)

