Что такое 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

Строки можно перебрать и с помощью цикла for, для этого нужно воспользоваться функцией iterrows

for index,row in df.iterrows():
    print(row['A']) 

Выборки

Получение

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

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'])

Выборка по позиции

Для получения по позиции или по номеру используется функция iloc. Возьмем третью строку

print(df.iloc[3])

Или строки с третьей по четвертую и столбцы с нулевого по первый (внимание, что правые границы диапазонов, т.е. строка с номером 5 и столбец с номером два, не включаются в результат)

print(df.iloc[3:5,0:2])

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

print(df.iloc[df.iloc[[1,2,4],[0,2]]])

Или же, например, получить несколько строк полностью

print(df.iloc[df.iloc[1:3,:]])
Аналогично со столбцами
print(df.iloc[:,1:3])

Фильтрация с помощью логических выражений

Выберем из таблица все строки, где значения из колонки А положительны

print(df[df.A > 0])

Или только положительные данные во всей таблице

print(df[df > 0])

                   A         B         C         D
2013-01-01  0.469112       NaN       NaN       NaN
2013-01-02  1.212112       NaN  0.119209       NaN
2013-01-03       NaN       NaN       NaN  1.071804
2013-01-04  0.721555       NaN       NaN  0.271860
2013-01-05       NaN  0.567020  0.276232       NaN
2013-01-06       NaN  0.113648       NaN  0.524988

Обратите внимание, что все отрицательные элементы были заменены на NaN. Специальный тип данных, указывающий на отсутствие значения.

Функция isin сверяет значения из строки или столбца со списком, и возвращает только те, которые содержатся и там, и там

df2 = df.copy() # функция copy копирует данные из одного датафрейма в другой
df2['E'] = ['one', 'one','two','three','four','three'] # добавим новый столбец с именем Е и присвоим ему значения из списка
 
print(df2)
 
print(df2['E'].isin(['two','four'])) # выделим из нашей таблицы только те строки, которые содержат слова two и four в столбце Е

                   A         B         C         D      E
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632    one
2013-01-02  1.212112 -0.173215  0.119209 -1.044236    one
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804    two
2013-01-04  0.721555 -0.706771 -1.039575  0.271860  three
2013-01-05 -0.424972  0.567020  0.276232 -1.087401   four
2013-01-06 -0.673690  0.113648 -1.478427  0.524988  three

                   A         B         C         D     E
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804   two
2013-01-05 -0.424972  0.567020  0.276232 -1.087401  four

Ввод/вывод

CSV

Чтение CSV файла делается в одну строку

pd.read_csv('foo.csv')

Задача 4

Найти всех легендарных покемонов.

Задача 5

Найти всех производителей шоколада, относящихся к конкретной стране и напечатать их на экран в виде

Страна1
 Производитель1.1
 Производитель1.2

Страна2
 Производитель2.1
 Производитель2.2
 Производитель2.3

python/week20.txt · Последние изменения: 08/10/2018 01:21 — ybezrukov
CC Attribution-Noncommercial 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0