мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Это старая версия документа!


Что такое pandas?

Практически с момента появления Питон активно используется для предобработки данных (например, прочитать текстовый файл и выделить из него нужные куски, очистить текст от лишних символов и т.д.) Очищенные данные можно позже направить, например, в табличный процессор, СУБД или статистическую систему для последующего анализа.

Библиотека pandas добавляет в Питон значительную часть аналитической функциональности больших пакетов.

Что pandas умеет?

  • Эффективный и быстрый тип DataFrame с встроенной индексацией, предназначенный для обработки данных;
  • Утилиты для чтения и записи данных между оперативной памятю и разными файловыми форматами или СУБД: CSV, текстовые файлы, Microsoft Excel, SQL базы данных и быстрый HDF5;
  • Автоматизированное упорядочивание данных с встроенной обработкой отсутствующих частей дает возможность эффективно автоматически размечать данные и работать с плохо упорядоченными данными;
  • Гибкое преобразование наборов данных;
  • Умное разделение по меткам, красивое индексирование и выделение подмножеств из больших наборов данных;
  • Для изменения размера можно добавлять и удалять колонки в структурах данных;
  • Объединение и преобразование данных с мощными средствами группировки в режиме раздели-примени-объедини;
  • Высокопроизводительное слияние и объединение наборов данных;
  • Работа с временными рядами: создание временных диапазонов, преобразование отсчетов, обработка со скользящим окном, линейная регрессия с скользящим окном, смещение и т.д.

Начало работы

Обычно мы будем сразу подключать эти модули для работы (добавить в начало файла):

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

Создание объекта

Можно создать серию (Series) передав список значений, для этого списка pandas самостоятельно создаст индекс (присвоит каждому элементу уникальный номер)

s = pd.Series([1,3,5,np.nan,6,8])
print(s)
0    1.0
1    3.0
2    5.0
3    NaN
4    6.0
5    8.0
dtype: float64

При создании объекта можно не полагаться на автоматический генератор индекса из pangas и указать свой.

Сначала создадим диапазон дан с помощью функции date_range из pandas

dates = pd.date_range('20130101', periods=6) # создаст диапазон из 6 дней, начиная с 1 января 2013 года
print(dates)
 
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD')) # создаст датафрейм из таблицы, размера 6 строк на 4 столбца (np.random.randn(6,4)), попросит в качестве индекса для строк использовать значения из переменной dates (index=dates), а для столбцов - список из четырех букв
print(df)
                   A         B         C         D
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
2013-01-05 -0.424972  0.567020  0.276232 -1.087401
2013-01-06 -0.673690  0.113648 -1.478427  0.524988

При создании датафрейма можно передать словарь объектов, который будет преобразован в серию

df2 = pd.DataFrame({ 'A' : 1., # одиночное вещественное число
                     'B' : pd.Timestamp('20130102'), # дата
                     'C' : pd.Series(1,index=list(range(4)),dtype='float32'), # список из четырех единиц с вещественным типом 
                     'D' : np.array([3] * 4,dtype='int32'), # 4 раза повторяется список из целочисленных троек
                     'E' : pd.Categorical(["test","train","test","train"]), # специальный тип, который хранит в себе категории, иными словами текстовые метки для данных
                     'F' : 'foo' }) # произвольная строка
 
print(df2)
     A          B    C  D      E    F
0  1.0 2013-01-02  1.0  3   test  foo
1  1.0 2013-01-02  1.0  3  train  foo
2  1.0 2013-01-02  1.0  3   test  foo
3  1.0 2013-01-02  1.0  3  train  foo

Каждая колонка в датафрейме имеет свой тип, который определен внутри pandas. Узнать его можно с помощью функции dtypes

print(df2.dtypes)
      
A           float64
B    datetime64[ns]
C           float32
D             int32
E          category
F            object
dtype: object

Просмотр данных

Просмотрим начальные и конечные строки в датафрейме. Функция head без аргументов вернет 5 первых строк, а tails с аргументом 3 - три последних

print(df.head())
                   A         B         C         D
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
2013-01-05 -0.424972  0.567020  0.276232 -1.087401
print(df.tail(3))
                   A         B         C         D
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
2013-01-05 -0.424972  0.567020  0.276232 -1.087401
2013-01-06 -0.673690  0.113648 -1.478427  0.524988

С помощью функций index, columns и values можно просмотреть значения индексов (имена строк), имена колонок и значения внутри таблицы.

print(df.index())
print(df.columns())
print(df.values())

Функция describe() покажет краткую сводку о данных

print(df.describe())
              A         B         C         D
count  6.000000  6.000000  6.000000  6.000000 # количество строк
mean   0.073711 -0.431125 -0.687758 -0.233103 # среднее значение элементов в столбце
std    0.843157  0.922818  0.779887  0.973118 # стандартное отклонение для каждого элемента
min   -0.861849 -2.104569 -1.509059 -1.135632 # наименьший элемент
25%   -0.611510 -0.600794 -1.368714 -1.076610 # 25 перцентиль
50%    0.022070 -0.228039 -0.767252 -0.386188 # 50 перцентиль или медиана
75%    0.658444  0.041933 -0.034326  0.461706 # 75 перцентиль
max    1.212112  0.567020  0.276232  1.071804 # наибольший элемент

Транспонировать таблицу (отразить относительно диагонали)

print(df.T)
   2013-01-01  2013-01-02  2013-01-03  2013-01-04  2013-01-05  2013-01-06
A    0.469112    1.212112   -0.861849    0.721555   -0.424972   -0.673690
B   -0.282863   -0.173215   -2.104569   -0.706771    0.567020    0.113648
C   -1.509059    0.119209   -0.494929   -1.039575    0.276232   -1.478427
D   -1.135632   -1.044236    1.071804    0.271860   -1.087401    0.524988

Упорядочить по направлению (например, по имени столбца)

print(df.sort_index(axis=1, ascending=False))
                   D         C         B         A
2013-01-01 -1.135632 -1.509059 -0.282863  0.469112
2013-01-02 -1.044236  0.119209 -0.173215  1.212112
2013-01-03  1.071804 -0.494929 -2.104569 -0.861849
2013-01-04  0.271860 -1.039575 -0.706771  0.721555
2013-01-05 -1.087401  0.276232  0.567020 -0.424972
2013-01-06  0.524988 -1.478427  0.113648 -0.673690

Упорядочить по значению элементов столбца (например по столбцу B)

print(df.sort_values(by='B'))
                   A         B         C         D
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-06 -0.673690  0.113648 -1.478427  0.524988
2013-01-05 -0.424972  0.567020  0.276232 -1.087401

Выборки

Получение

Выбор данных из колонок и стобцов очень похож на работу с списками. Одна колонка

print(df['A'])

Диапазон строк по номеру

print(df[0:3])

Диапазон строк по значению индекса

print(df['20130102':'20130104'])

Выборка по метке

Для сечения таблицы по метке используется функция loc, например, получим все значения для строки, индекс которой совпадает с нулевым элементом списка dates (мы его создавали в самом начале)

print(df.loc[dates[0]])

Никто не мешает нам выбрать одновременно по двум осям - строкам и столбцам. Выберем подтаблицу, которая содержит все строки и два столбца

print(df.loc[:,['A','B']])

Или только три строки

print(df.loc['20130102':'20130104',['A','B']])

Одно значение из таблицы получим с помощью

print(df.loc[dates[0],'A'])