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

# ### Урок 5.4: характеристики датафрейма `pandas`

# In[1]:


import pandas as pd
df = pd.DataFrame([['Anna', 23, 3],
             ['Sam', 36, 12],
             ['Bill', 33, 10],
             ['Moica', 25, 7],
             ['Lisa', 27, 7],
             ['Peter', 32, None]])
df.columns = ['name', 'age', 'expr']  


# Какую сводную информацию по таблице можно получить? Например, число переменных (столбцов) и наблюдений (строк), а также число заполненных значений.

# In[2]:


df.info()


# Какую информацию выдал метод `.info()`? Во-первых, он сообщил нам, что `df` является объектом `DataFrame`. Во-вторых, он вывел число строк (`6 entries`) и показал их индексы. В-третьих, он вывел число столбцов (`total 3 columns`). Наконец, он выдал информацию по каждому столбцу. Остановимся на этом поподробнее.
# 
# В выдаче выше представлено, сколько непустых элементов содержится в каждом столбце. Непустые элементы `non-null` – это всё, кроме пропущенных значений, которые кодируются особым образом (`NaN` – от *Not A Number*). В нашей таблице почти все столбцы заполнены полностью: 6 ненулевых элементов из 6.
# 
# Далее указан тип каждого столбца, целочисленный `int64` и с плавающей точкой `float64`. Что означают числа в конце? Это объем памяти, который требуется для хранения.
# 
# При желании можно запросить число строк и столбцов отдельно:

# In[3]:


df.shape  # как в массивах numpy


# In[6]:


df.shape[0] # отдельно строкиё


# In[7]:


df.shape[1]  # отдельно столбцы


# Можем запросить описательные статистики по столбцам данного датафрейма:

# In[12]:


df.describe()


# В случае количественных показателей этот метод возвращает таблицу с основными описательными статистиками:
# 
# * `count` – число непустых (заполненных) значений;
# * `mean` – среднее арифметическое;
# * `std` – стандартное отклонение (показатель разброса данных относительно среднего значения);
# * `min` – миниммальное значение;
# * `max` – максимальное значение;
# * `25%` – нижний квартиль (значение, которое 25% значений не превышают);
# * `50%` – медиана (значение, которое 50% значений не превышают);
# * `75%` – верхний квартиль (значение, которое 75% значений не превышают).

# Можем вывести названия столбцов:

# In[8]:


df.columns


# Обратите внимание: полученный объект не является обычным списком:

# In[9]:


type(df.columns)


# Если мы попробуем обратиться к элементу как обычно, всё получится:

# In[13]:


df.columns[2]


# А вот изменить значение уже нет:

# In[14]:


df.columns[2] = 'experience'


# Чтобы получить список названий, достаточно сконвертировать тип с помощью привычного `list()`:

# In[10]:


list(df.columns)


# Аналогично для строк:

# In[11]:


df.index

