Python Pandas - Краткое руководство
Pandas - это библиотека Python с открытым исходным кодом, предоставляющая высокопроизводительный инструмент для обработки и анализа данных с использованием мощных структур данных. Название Pandas происходит от слова Panel Data - эконометрика из многомерных данных.
В 2008 году разработчик Уэс МакКинни начал разрабатывать панд, когда ему требовался высокопроизводительный гибкий инструмент для анализа данных.
До Pandas Python в основном использовался для обработки и подготовки данных. Он внес очень небольшой вклад в анализ данных. Панды решили эту проблему. Используя Pandas, мы можем выполнить пять типичных шагов в обработке и анализе данных, независимо от их происхождения: загрузка, подготовка, управление, моделирование и анализ.
Python с Pandas используется в широком спектре областей, включая академические и коммерческие области, включая финансы, экономику, статистику, аналитику и т. Д.
Ключевые особенности Pandas
- Быстрый и эффективный объект DataFrame со стандартной и индивидуальной индексацией.
- Инструменты для загрузки данных в объекты данных в памяти из файлов разных форматов.
- Согласование данных и интегрированная обработка недостающих данных.
- Изменение формы и поворота наборов дат.
- Нарезка на основе меток, индексация и разделение больших наборов данных.
- Столбцы из структуры данных можно удалять или вставлять.
- Группируйте данные для агрегирования и преобразования.
- Высокопроизводительное слияние и соединение данных.
- Функциональность временных рядов.
Стандартный дистрибутив Python не поставляется в комплекте с модулем Pandas. Легкая альтернатива - установить NumPy с помощью популярного установщика пакетов Python,pip.
pip install pandas
Если вы установите пакет Anaconda Python, Pandas будет установлен по умолчанию со следующим:
Windows
Anaconda (из https://www.continuum.io) - это бесплатный дистрибутив Python для стека SciPy. Он также доступен для Linux и Mac.
Canopy (https://www.enthought.com/products/canopy/) доступен как бесплатный, так и коммерческий дистрибутив с полным стеком SciPy для Windows, Linux и Mac.
Python(x, y) - это бесплатный дистрибутив Python со стеком SciPy и Spyder IDE для ОС Windows. (Можно загрузить сhttp://python-xy.github.io/)
Linux
Менеджеры пакетов соответствующих дистрибутивов Linux используются для установки одного или нескольких пакетов в стек SciPy.
For Ubuntu Users
sudo apt-get install python-numpy python-scipy python-matplotlibipythonipythonnotebook
python-pandas python-sympy python-nose
For Fedora Users
sudo yum install numpyscipy python-matplotlibipython python-pandas sympy
python-nose atlas-devel
Pandas имеет дело со следующими тремя структурами данных -
- Series
- DataFrame
- Panel
Эти структуры данных построены на основе массива Numpy, что означает, что они быстрые.
Размер и описание
Лучший способ думать об этих структурах данных - это то, что структура данных более высокого измерения является контейнером структуры данных более низкого измерения. Например, DataFrame - это контейнер Series, Panel - контейнер DataFrame.
Структура данных | Габаритные размеры | Описание |
---|---|---|
Серии | 1 | Однородный массив, помеченный 1D, неизменяемый размер. |
Фреймы данных | 2 | Общая двухмерная маркированная табличная структура с изменяемым размером и потенциально неоднородно типизированными столбцами. |
Панель | 3 | Общий трехмерный помеченный массив с изменяемым размером. |
Создание и обработка двумерных массивов и управление ими - утомительная задача, на пользователя ложится бремя учитывать ориентацию набора данных при написании функций. Но с использованием структур данных Pandas умственные усилия пользователя снижаются.
Например, с табличными данными (DataFrame) семантически более полезно подумать о index (ряды) и columns вместо оси 0 и оси 1.
Изменчивость
Все структуры данных Pandas являются изменяемыми по значению (могут быть изменены), и, за исключением Series, все изменяются по размеру. Размер серии неизменен.
Note- DataFrame широко используется и является одной из самых важных структур данных. Панель используется гораздо реже.
Серии
Серия - это одномерный массив, подобный структуре с однородными данными. Например, следующая серия представляет собой набор целых чисел 10, 23, 56,…
10 | 23 | 56 | 17 | 52 | 61 | 73 | 90 | 26 | 72 |
Ключевые моменты
- Однородные данные
- Неизменяемый размер
- Значения изменяемых данных
DataFrame
DataFrame - это двумерный массив с разнородными данными. Например,
имя | Возраст | Пол | Рейтинг |
---|---|---|---|
Стив | 32 | мужчина | 3,45 |
Лия | 28 | женский | 4.6 |
Вин | 45 | мужчина | 3.9 |
Кэти | 38 | женский | 2,78 |
В таблице представлены данные отдела продаж организации с их общим рейтингом производительности. Данные представлены в строках и столбцах. Каждый столбец представляет атрибут, а каждая строка представляет человека.
Тип данных столбцов
Типы данных четырех столбцов следующие:
Столбец | Тип |
---|---|
имя | Строка |
Возраст | Целое число |
Пол | Строка |
Рейтинг | Плавать |
Ключевые моменты
- Гетерогенные данные
- Размер изменяемый
- Изменяемые данные
Панель
Panel - это трехмерная структура данных с разнородными данными. Панель сложно представить в графическом виде. Но панель можно проиллюстрировать как контейнер DataFrame.
Ключевые моменты
- Гетерогенные данные
- Размер изменяемый
- Изменяемые данные
Серия - это одномерный помеченный массив, способный хранить данные любого типа (целые, строковые, плавающие, объекты Python и т. Д.). Метки осей вместе называются индексами.
панды. серия
Серию панд можно создать с помощью следующего конструктора -
pandas.Series( data, index, dtype, copy)
Параметры конструктора следующие:
Старший Нет | Параметр и описание |
---|---|
1 | data данные принимают различные формы, такие как ndarray, список, константы |
2 | index Значения индекса должны быть уникальными и хешируемыми, той же длины, что и данные. По умолчаниюnp.arange(n) если индекс не передан. |
3 | dtype dtype предназначен для типа данных. Если нет, будет выведен тип данных. |
4 | copy Скопируйте данные. По умолчанию False |
Серия может быть создана с использованием различных входов, таких как -
- Array
- Dict
- Скалярное значение или константа
Создать пустую серию
Базовая серия, которую можно создать, - это пустая серия.
пример
#import the pandas library and aliasing as pd
import pandas as pd
s = pd.Series()
print s
это output выглядит следующим образом -
Series([], dtype: float64)
Создать серию из ndarray
Если данные представляют собой массив ndarray, то переданный индекс должен иметь одинаковую длину. Если индекс не передан, то по умолчанию индекс будетrange(n) где n - длина массива, т.е. [0,1,2,3…. range(len(array))-1].
Пример 1
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'])
s = pd.Series(data)
print s
это output выглядит следующим образом -
0 a
1 b
2 c
3 d
dtype: object
Мы не передавали никакого индекса, поэтому по умолчанию он присвоил индексы от 0 до len(data)-1, то есть от 0 до 3.
Пример 2
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'])
s = pd.Series(data,index=[100,101,102,103])
print s
это output выглядит следующим образом -
100 a
101 b
102 c
103 d
dtype: object
Мы передали сюда значения индекса. Теперь мы можем видеть настроенные индексированные значения на выходе.
Создать серию из dict
А dictмогут быть переданы в качестве входных данных, и если индекс не указан, то ключи словаря берутся в отсортированном порядке для построения индекса. Еслиindex передается, значения в данных, соответствующие меткам в индексе, будут извлечены.
Пример 1
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = {'a' : 0., 'b' : 1., 'c' : 2.}
s = pd.Series(data)
print s
это output выглядит следующим образом -
a 0.0
b 1.0
c 2.0
dtype: float64
Observe - Ключи словаря используются для построения индекса.
Пример 2
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = {'a' : 0., 'b' : 1., 'c' : 2.}
s = pd.Series(data,index=['b','c','d','a'])
print s
это output выглядит следующим образом -
b 1.0
c 2.0
d NaN
a 0.0
dtype: float64
Observe - Порядок индекса сохраняется, а отсутствующий элемент заполняется NaN (не числом).
Создать серию из скаляра
Если данные представляют собой скалярное значение, необходимо указать индекс. Значение будет повторяться, чтобы соответствовать длинеindex
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
s = pd.Series(5, index=[0, 1, 2, 3])
print s
это output выглядит следующим образом -
0 5
1 5
2 5
3 5
dtype: int64
Доступ к данным из серии с позицией
Доступ к данным в серии можно получить так же, как в ndarray.
Пример 1
Получить первый элемент. Как мы уже знаем, что отсчет начинается с нуля для массива, что означает , что первый элемент сохраняется в нуле - е места и так далее.
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#retrieve the first element
print s[0]
это output выглядит следующим образом -
1
Пример 2
Получите первые три элемента в серии. Если перед ним вставлен:, будут извлечены все элементы, начиная с этого индекса. Если используются два параметра (с: между ними), элементы между двумя индексами (не включая стоп-индекс)
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#retrieve the first three element
print s[:3]
это output выглядит следующим образом -
a 1
b 2
c 3
dtype: int64
Пример 3
Получите последние три элемента.
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#retrieve the last three element
print s[-3:]
это output выглядит следующим образом -
c 3
d 4
e 5
dtype: int64
Получить данные с помощью метки (индекс)
Серия похожа на фиксированный размер dict в том, что вы можете получать и устанавливать значения по метке индекса.
Пример 1
Получить один элемент, используя значение метки индекса.
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#retrieve a single element
print s['a']
это output выглядит следующим образом -
1
Пример 2
Получите несколько элементов, используя список значений метки индекса.
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#retrieve multiple elements
print s[['a','c','d']]
это output выглядит следующим образом -
a 1
c 3
d 4
dtype: int64
Пример 3
Если метка отсутствует, возникает исключение.
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#retrieve multiple elements
print s['f']
это output выглядит следующим образом -
…
KeyError: 'f'
Фрейм данных - это двумерная структура данных, т. Е. Данные выровнены в табличной форме по строкам и столбцам.
Особенности DataFrame
- Потенциально столбцы бывают разных типов
- Размер - изменяемый
- Помеченные оси (строки и столбцы)
- Может выполнять арифметические операции со строками и столбцами
Структура
Предположим, что мы создаем фрейм данных с данными студента.
Вы можете думать об этом как о таблице SQL или представлении данных электронной таблицы.
pandas.DataFrame
DataFrame pandas можно создать с помощью следующего конструктора -
pandas.DataFrame( data, index, columns, dtype, copy)
Параметры конструктора следующие:
Старший Нет | Параметр и описание |
---|---|
1 | data данные принимают различные формы, такие как ndarray, series, map, lists, dict, constants, а также другой DataFrame. |
2 | index Для меток строк индекс, который будет использоваться для результирующего кадра, является необязательным по умолчанию np.arange (n), если индекс не передан. |
3 | columns Для меток столбцов необязательный синтаксис по умолчанию - np.arange (n). Это верно только в том случае, если индекс не передан. |
4 | dtype Тип данных каждого столбца. |
5 | copy Эта команда (или что-то еще) используется для копирования данных, если по умолчанию установлено значение False. |
Создать DataFrame
DataFrame pandas может быть создан с использованием различных входных данных, таких как -
- Lists
- dict
- Series
- Numpy ndarrays
- Другой DataFrame
В следующих разделах этой главы мы увидим, как создать DataFrame, используя эти входные данные.
Создать пустой фрейм данных
Базовый фрейм данных, который можно создать, представляет собой пустой фрейм данных.
пример
#import the pandas library and aliasing as pd
import pandas as pd
df = pd.DataFrame()
print df
это output выглядит следующим образом -
Empty DataFrame
Columns: []
Index: []
Создать DataFrame из списков
DataFrame может быть создан с использованием одного списка или списка списков.
Пример 1
import pandas as pd
data = [1,2,3,4,5]
df = pd.DataFrame(data)
print df
это output выглядит следующим образом -
0
0 1
1 2
2 3
3 4
4 5
Пример 2
import pandas as pd
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'])
print df
это output выглядит следующим образом -
Name Age
0 Alex 10
1 Bob 12
2 Clarke 13
Пример 3
import pandas as pd
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'],dtype=float)
print df
это output выглядит следующим образом -
Name Age
0 Alex 10.0
1 Bob 12.0
2 Clarke 13.0
Note - Обратите внимание, dtype Параметр изменяет тип столбца Age на плавающую точку.
Создайте DataFrame из Dict из ndarrays / Lists
Все ndarraysдолжны быть одинаковой длины. Если передается index, то длина индекса должна быть равна длине массивов.
Если индекс не передан, то по умолчанию индекс будет диапазоном (n), где n - длина массива.
Пример 1
import pandas as pd
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data)
print df
это output выглядит следующим образом -
Age Name
0 28 Tom
1 34 Jack
2 29 Steve
3 42 Ricky
Note- Соблюдайте значения 0,1,2,3. Они являются индексом по умолчанию, назначаемым каждому с помощью диапазона функций (n).
Пример 2
Давайте теперь создадим индексированный DataFrame с использованием массивов.
import pandas as pd
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data, index=['rank1','rank2','rank3','rank4'])
print df
это output выглядит следующим образом -
Age Name
rank1 28 Tom
rank2 34 Jack
rank3 29 Steve
rank4 42 Ricky
Note - Обратите внимание, index Параметр присваивает индекс каждой строке.
Создать DataFrame из списка Dicts
Список словарей можно передать в качестве входных данных для создания DataFrame. Ключи словаря по умолчанию используются как имена столбцов.
Пример 1
В следующем примере показано, как создать DataFrame, передав список словарей.
import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)
print df
это output выглядит следующим образом -
a b c
0 1 2 NaN
1 5 10 20.0
Note - Обратите внимание, NaN (не число) добавляется в пропущенные области.
Пример 2
В следующем примере показано, как создать DataFrame, передав список словарей и индексы строк.
import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data, index=['first', 'second'])
print df
это output выглядит следующим образом -
a b c
first 1 2 NaN
second 5 10 20.0
Пример 3
В следующем примере показано, как создать DataFrame со списком словарей, индексов строк и индексов столбцов.
import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
#With two column indices, values same as dictionary keys
df1 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b'])
#With two column indices with one index with other name
df2 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b1'])
print df1
print df2
это output выглядит следующим образом -
#df1 output
a b
first 1 2
second 5 10
#df2 output
a b1
first 1 NaN
second 5 NaN
Note- Заметьте, df2 DataFrame создается с индексом столбца, отличным от ключа словаря; таким образом, добавлены NaN на место. Принимая во внимание, что df1 создается с индексами столбцов, такими же, как ключи словаря, поэтому добавляется NaN.
Создайте DataFrame из Dict of Series
Dictionary of Series может быть передан для формирования DataFrame. Результирующий индекс - это объединение всех переданных индексов серии.
пример
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df
это output выглядит следующим образом -
one two
a 1.0 1
b 2.0 2
c 3.0 3
d NaN 4
Note - Обратите внимание, для серии один ярлык отсутствует ‘d’ прошло, но в результате для d метка, к NaN добавляется NaN.
Давайте теперь поймем column selection, addition, и deletion через примеры.
Выбор столбца
Мы поймем это, выбрав столбец из DataFrame.
пример
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df ['one']
это output выглядит следующим образом -
a 1.0
b 2.0
c 3.0
d NaN
Name: one, dtype: float64
Добавление столбца
Мы поймем это, добавив новый столбец в существующий фрейм данных.
пример
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
# Adding a new column to an existing DataFrame object with column label by passing new series
print ("Adding a new column by passing as Series:")
df['three']=pd.Series([10,20,30],index=['a','b','c'])
print df
print ("Adding a new column using the existing columns in DataFrame:")
df['four']=df['one']+df['three']
print df
это output выглядит следующим образом -
Adding a new column by passing as Series:
one two three
a 1.0 1 10.0
b 2.0 2 20.0
c 3.0 3 30.0
d NaN 4 NaN
Adding a new column using the existing columns in DataFrame:
one two three four
a 1.0 1 10.0 11.0
b 2.0 2 20.0 22.0
c 3.0 3 30.0 33.0
d NaN 4 NaN NaN
Удаление столбца
Столбцы можно удалять или открывать; давайте рассмотрим пример, чтобы понять, как это сделать.
пример
# Using the previous DataFrame, we will delete a column
# using del function
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd']),
'three' : pd.Series([10,20,30], index=['a','b','c'])}
df = pd.DataFrame(d)
print ("Our dataframe is:")
print df
# using del function
print ("Deleting the first column using DEL function:")
del df['one']
print df
# using pop function
print ("Deleting another column using POP function:")
df.pop('two')
print df
это output выглядит следующим образом -
Our dataframe is:
one three two
a 1.0 10.0 1
b 2.0 20.0 2
c 3.0 30.0 3
d NaN NaN 4
Deleting the first column using DEL function:
three two
a 10.0 1
b 20.0 2
c 30.0 3
d NaN 4
Deleting another column using POP function:
three
a 10.0
b 20.0
c 30.0
d NaN
Выбор, добавление и удаление строк
Теперь мы разберемся с выбором, добавлением и удалением строк на примерах. Начнем с концепции отбора.
Выбор по метке
Строки можно выбрать, передав метку строки в loc функция.
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df.loc['b']
это output выглядит следующим образом -
one 2.0
two 2.0
Name: b, dtype: float64
Результатом является серия с метками в качестве имен столбцов DataFrame. И имя серии - это метка, с которой она извлекается.
Выбор по целочисленному положению
Строки можно выбрать, передав целочисленное расположение в iloc функция.
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df.iloc[2]
это output выглядит следующим образом -
one 3.0
two 3.0
Name: c, dtype: float64
Нарезать строки
Несколько строк можно выбрать с помощью оператора ':'.
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df[2:4]
это output выглядит следующим образом -
one two
c 3.0 3
d NaN 4
Добавление строк
Добавьте новые строки в DataFrame, используя appendфункция. Эта функция добавит строки в конец.
import pandas as pd
df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])
df = df.append(df2)
print df
это output выглядит следующим образом -
a b
0 1 2
1 3 4
0 5 6
1 7 8
Удаление строк
Используйте метку индекса, чтобы удалить или отбросить строки из DataFrame. Если метка дублируется, то несколько строк будут отброшены.
Если вы заметили, в приведенном выше примере метки дублируются. Давайте сбросим метку и посмотрим, сколько строк будет отброшено.
import pandas as pd
df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])
df = df.append(df2)
# Drop rows with label 0
df = df.drop(0)
print df
это output выглядит следующим образом -
a b
1 3 4
1 7 8
В приведенном выше примере две строки были отброшены, потому что эти две содержат одинаковую метку 0.
А panelпредставляет собой трехмерный контейнер данных. СрокPanel data происходит от эконометрики и частично отвечает за название pandas - pan(el)-da(ta)-с.
Названия трех осей предназначены для придания некоторого семантического значения описанию операций с панельными данными. Они -
items - ось 0, каждый элемент соответствует содержащемуся внутри DataFrame.
major_axis - ось 1, это индекс (строки) каждого из DataFrames.
minor_axis - ось 2, это столбцы каждого из DataFrames.
pandas.Panel ()
Панель можно создать с помощью следующего конструктора -
pandas.Panel(data, items, major_axis, minor_axis, dtype, copy)
Параметры конструктора следующие:
Параметр | Описание |
---|---|
данные | Данные принимают различные формы, такие как ndarray, series, map, lists, dict, constants, а также другой DataFrame. |
Предметы | ось = 0 |
major_axis | ось = 1 |
minor_axis | ось = 2 |
dtype | Тип данных каждого столбца |
копировать | Скопируйте данные. По умолчанию,false |
Создать панель
Панель можно создать несколькими способами, например:
- Из ndarrays
- Из dict DataFrames
Из 3D ndarray
# creating an empty panel
import pandas as pd
import numpy as np
data = np.random.rand(2,4,5)
p = pd.Panel(data)
print p
это output выглядит следующим образом -
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 4 (major_axis) x 5 (minor_axis)
Items axis: 0 to 1
Major_axis axis: 0 to 3
Minor_axis axis: 0 to 4
Note - Обратите внимание на размеры пустой панели и панели выше, все объекты разные.
Из dict объектов DataFrame
#creating an empty panel
import pandas as pd
import numpy as np
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p
это output выглядит следующим образом -
Dimensions: 2 (items) x 4 (major_axis) x 3 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 0 to 3
Minor_axis axis: 0 to 2
Создать пустую панель
Пустую панель можно создать с помощью конструктора Panel следующим образом:
#creating an empty panel
import pandas as pd
p = pd.Panel()
print p
это output выглядит следующим образом -
<class 'pandas.core.panel.Panel'>
Dimensions: 0 (items) x 0 (major_axis) x 0 (minor_axis)
Items axis: None
Major_axis axis: None
Minor_axis axis: None
Выбор данных из панели
Выберите данные на панели, используя -
- Items
- Major_axis
- Minor_axis
Использование предметов
# creating an empty panel
import pandas as pd
import numpy as np
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p['Item1']
это output выглядит следующим образом -
0 1 2
0 0.488224 -0.128637 0.930817
1 0.417497 0.896681 0.576657
2 -2.775266 0.571668 0.290082
3 -0.400538 -0.144234 1.110535
У нас есть два элемента, и мы получили item1. Результатом является DataFrame с 4 строками и 3 столбцами, которые являютсяMajor_axis и Minor_axis Габаритные размеры.
Использование major_axis
Доступ к данным можно получить с помощью метода panel.major_axis(index).
# creating an empty panel
import pandas as pd
import numpy as np
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p.major_xs(1)
это output выглядит следующим образом -
Item1 Item2
0 0.417497 0.748412
1 0.896681 -0.557322
2 0.576657 NaN
Использование minor_axis
Доступ к данным можно получить с помощью метода panel.minor_axis(index).
# creating an empty panel
import pandas as pd
import numpy as np
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p.minor_xs(1)
это output выглядит следующим образом -
Item1 Item2
0 -0.128637 -1.047032
1 0.896681 -0.557322
2 0.571668 0.431953
3 -0.144234 1.302466
Note - Понаблюдайте за изменением размеров.
К настоящему времени мы узнали о трех структурах данных Pandas и о том, как их создавать. Мы в основном сосредоточимся на объектах DataFrame из-за их важности для обработки данных в реальном времени, а также обсудим несколько других структур данных.
Основные функции серии
Sr.No. | Атрибут или метод и описание |
---|---|
1 | axes Возвращает список меток оси строк |
2 | dtype Возвращает dtype объекта. |
3 | empty Возвращает True, если серия пуста. |
4 | ndim Возвращает количество измерений базовых данных по определению 1. |
5 | size Возвращает количество элементов в базовых данных. |
6 | values Возвращает серию как ndarray. |
7 | head() Возвращает первые n строк. |
8 | tail() Возвращает последние n строк. |
Давайте теперь создадим серию и посмотрим на все вышеупомянутые операции с табличными атрибутами.
пример
import pandas as pd
import numpy as np
#Create a series with 100 random numbers
s = pd.Series(np.random.randn(4))
print s
это output выглядит следующим образом -
0 0.967853
1 -0.148368
2 -1.395906
3 -1.758394
dtype: float64
топоры
Возвращает список меток серии.
import pandas as pd
import numpy as np
#Create a series with 100 random numbers
s = pd.Series(np.random.randn(4))
print ("The axes are:")
print s.axes
это output выглядит следующим образом -
The axes are:
[RangeIndex(start=0, stop=4, step=1)]
Результатом выше является компактный формат списка значений от 0 до 5, то есть [0,1,2,3,4].
пустой
Возвращает логическое значение, показывающее, является ли объект пустым или нет. Истина означает, что объект пуст.
import pandas as pd
import numpy as np
#Create a series with 100 random numbers
s = pd.Series(np.random.randn(4))
print ("Is the Object empty?")
print s.empty
это output выглядит следующим образом -
Is the Object empty?
False
ndim
Возвращает количество измерений объекта. По определению, серия - это одномерная структура данных, поэтому она возвращает
import pandas as pd
import numpy as np
#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print s
print ("The dimensions of the object:")
print s.ndim
это output выглядит следующим образом -
0 0.175898
1 0.166197
2 -0.609712
3 -1.377000
dtype: float64
The dimensions of the object:
1
размер
Возвращает размер (длину) серии.
import pandas as pd
import numpy as np
#Create a series with 4 random numbers
s = pd.Series(np.random.randn(2))
print s
print ("The size of the object:")
print s.size
это output выглядит следующим образом -
0 3.078058
1 -1.207803
dtype: float64
The size of the object:
2
значения
Возвращает фактические данные в серии в виде массива.
import pandas as pd
import numpy as np
#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print s
print ("The actual data series is:")
print s.values
это output выглядит следующим образом -
0 1.787373
1 -0.605159
2 0.180477
3 -0.140922
dtype: float64
The actual data series is:
[ 1.78737302 -0.60515881 0.18047664 -0.1409218 ]
Голова и хвост
Чтобы просмотреть небольшой образец объекта Series или DataFrame, используйте методы head () и tail ().
head() возвращает первый nстрок (обратите внимание на значения индекса). По умолчанию количество отображаемых элементов равно пяти, но вы можете передать собственное число.
import pandas as pd
import numpy as np
#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print ("The original series is:")
print s
print ("The first two rows of the data series:")
print s.head(2)
это output выглядит следующим образом -
The original series is:
0 0.720876
1 -0.765898
2 0.479221
3 -0.139547
dtype: float64
The first two rows of the data series:
0 0.720876
1 -0.765898
dtype: float64
tail() возвращает последний nстрок (обратите внимание на значения индекса). По умолчанию количество отображаемых элементов равно пяти, но вы можете передать собственное число.
import pandas as pd
import numpy as np
#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print ("The original series is:")
print s
print ("The last two rows of the data series:")
print s.tail(2)
это output выглядит следующим образом -
The original series is:
0 -0.655091
1 -0.881407
2 -0.608592
3 -2.341413
dtype: float64
The last two rows of the data series:
2 -0.608592
3 -2.341413
dtype: float64
Базовые функции DataFrame
Давайте теперь поймем, что такое базовая функциональность DataFrame. В следующих таблицах перечислены важные атрибуты или методы, которые помогают в базовой функциональности DataFrame.
Sr.No. | Атрибут или метод и описание |
---|---|
1 | T Переставляет строки и столбцы. |
2 | axes Возвращает список с метками оси строк и метками оси столбцов в качестве единственных членов. |
3 | dtypes Возвращает типы в этом объекте. |
4 | empty Истинно, если NDFrame полностью пуст [нет элементов]; если какая-либо из осей имеет длину 0. |
5 | ndim Количество осей / размеров массива. |
6 | shape Возвращает кортеж, представляющий размерность DataFrame. |
7 | size Количество элементов в NDFrame. |
8 | values Numpy представление NDFrame. |
9 | head() Возвращает первые n строк. |
10 | tail() Возвращает последние n строк. |
Давайте теперь создадим DataFrame и посмотрим, как работают вышеупомянутые атрибуты.
пример
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our data series is:")
print df
это output выглядит следующим образом -
Our data series is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
T (транспонировать)
Возвращает транспонированный DataFrame. Строки и столбцы поменяются местами.
import pandas as pd
import numpy as np
# Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
# Create a DataFrame
df = pd.DataFrame(d)
print ("The transpose of the data series is:")
print df.T
это output выглядит следующим образом -
The transpose of the data series is:
0 1 2 3 4 5 6
Age 25 26 25 23 30 29 23
Name Tom James Ricky Vin Steve Smith Jack
Rating 4.23 3.24 3.98 2.56 3.2 4.6 3.8
топоры
Возвращает список меток осей строк и меток осей столбцов.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Row axis labels and column axis labels are:")
print df.axes
это output выглядит следующим образом -
Row axis labels and column axis labels are:
[RangeIndex(start=0, stop=7, step=1), Index([u'Age', u'Name', u'Rating'],
dtype='object')]
dtypes
Возвращает тип данных каждого столбца.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("The data types of each column are:")
print df.dtypes
это output выглядит следующим образом -
The data types of each column are:
Age int64
Name object
Rating float64
dtype: object
пустой
Возвращает логическое значение, показывающее, пуст объект или нет; Истина означает, что объект пуст.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Is the object empty?")
print df.empty
это output выглядит следующим образом -
Is the object empty?
False
ndim
Возвращает количество измерений объекта. По определению DataFrame - это 2D-объект.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The dimension of the object is:")
print df.ndim
это output выглядит следующим образом -
Our object is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
The dimension of the object is:
2
форма
Возвращает кортеж, представляющий размерность DataFrame. Кортеж (a, b), где a представляет количество строк, аb представляет количество столбцов.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The shape of the object is:")
print df.shape
это output выглядит следующим образом -
Our object is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
The shape of the object is:
(7, 3)
размер
Возвращает количество элементов в DataFrame.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The total number of elements in our object is:")
print df.size
это output выглядит следующим образом -
Our object is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
The total number of elements in our object is:
21
значения
Возвращает фактические данные в DataFrame в виде NDarray.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The actual data in our data frame is:")
print df.values
это output выглядит следующим образом -
Our object is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
The actual data in our data frame is:
[[25 'Tom' 4.23]
[26 'James' 3.24]
[25 'Ricky' 3.98]
[23 'Vin' 2.56]
[30 'Steve' 3.2]
[29 'Smith' 4.6]
[23 'Jack' 3.8]]
Голова и хвост
Чтобы просмотреть небольшой образец объекта DataFrame, используйте head() и tail () методы. head() возвращает первый nстрок (обратите внимание на значения индекса). По умолчанию количество отображаемых элементов равно пяти, но вы можете передать собственное число.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our data frame is:")
print df
print ("The first two rows of the data frame is:")
print df.head(2)
это output выглядит следующим образом -
Our data frame is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
The first two rows of the data frame is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
tail() возвращает последний nстрок (обратите внимание на значения индекса). По умолчанию количество отображаемых элементов равно пяти, но вы можете передать собственное число.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our data frame is:")
print df
print ("The last two rows of the data frame is:")
print df.tail(2)
это output выглядит следующим образом -
Our data frame is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
The last two rows of the data frame is:
Age Name Rating
5 29 Smith 4.6
6 23 Jack 3.8
Большое количество методов совместно вычисляют описательную статистику и другие связанные операции с DataFrame. Большинство из них представляют собой агрегаты типаsum(), mean(), но некоторые из них, как sumsum(), создайте объект того же размера. Вообще говоря, эти методы требуютaxisаргумент, как и ndarray. {sum, std, ...}, но ось может быть указана по имени или целому числу
DataFrame - «индекс» (ось = 0, по умолчанию), «столбцы» (ось = 1)
Давайте создадим DataFrame и будем использовать этот объект в этой главе для всех операций.
пример
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df
это output выглядит следующим образом -
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
7 34 Lee 3.78
8 40 David 2.98
9 30 Gasper 4.80
10 51 Betina 4.10
11 46 Andres 3.65
sum()
Returns the sum of the values for the requested axis. By default, axis is index (axis=0).
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df.sum()
Its output is as follows −
Age 382
Name TomJamesRickyVinSteveSmithJackLeeDavidGasperBe...
Rating 44.92
dtype: object
Each individual column is added individually (Strings are appended).
axis=1
This syntax will give the output as shown below.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df.sum(1)
это output выглядит следующим образом -
0 29.23
1 29.24
2 28.98
3 25.56
4 33.20
5 33.60
6 26.80
7 37.78
8 42.98
9 34.80
10 55.10
11 49.65
dtype: float64
значить()
Возвращает среднее значение.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df.mean()
это output выглядит следующим образом -
Age 31.833333
Rating 3.743333
dtype: float64
std ()
Возвращает стандартное отклонение Бресселя числовых столбцов.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df.std()
это output выглядит следующим образом -
Age 9.232682
Rating 0.661628
dtype: float64
Функции и описание
Давайте теперь разберемся с функциями описательной статистики в Python Pandas. В следующей таблице перечислены важные функции -
Sr.No. | Функция | Описание |
---|---|---|
1 | count () | Количество ненулевых наблюдений |
2 | сумма () | Сумма значений |
3 | значить() | Среднее значение |
4 | медиана () | Медиана значений |
5 | Режим() | Режим ценностей |
6 | std () | Стандартное отклонение значений |
7 | мин () | Минимальное значение |
8 | Максимум() | Максимальное значение |
9 | абс () | Абсолютная величина |
10 | prod () | Продукт ценностей |
11 | кончает () | Накопительная сумма |
12 | cumprod () | Совокупный продукт |
Note- Поскольку DataFrame - это гетерогенная структура данных. Общие операции работают не со всеми функциями.
Функции вроде sum(), cumsum()работать как с числовыми, так и с символьными (или) строковыми элементами данных без ошибок. Хотяn На практике агрегаты символов обычно никогда не используются, эти функции не вызывают никаких исключений.
Функции вроде abs(), cumprod() генерировать исключение, когда DataFrame содержит символьные или строковые данные, поскольку такие операции не могут быть выполнены.
Обобщение данных
В describe() Функция вычисляет сводку статистики, относящуюся к столбцам DataFrame.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df.describe()
это output выглядит следующим образом -
Age Rating
count 12.000000 12.000000
mean 31.833333 3.743333
std 9.232682 0.661628
min 23.000000 2.560000
25% 25.000000 3.230000
50% 29.500000 3.790000
75% 35.500000 4.132500
max 51.000000 4.800000
Эта функция дает mean, std и IQRзначения. И функция исключает символьные столбцы и дает сводку о числовых столбцах.'include'- это аргумент, который используется для передачи необходимой информации о том, какие столбцы необходимо учитывать при подведении итогов. Принимает список значений; по умолчанию "число".
- object - Суммирует строковые столбцы
- number - Суммирует числовые столбцы
- all - Суммирует все столбцы вместе (не следует передавать как значение списка)
Теперь используйте в программе следующий оператор и проверьте вывод -
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df.describe(include=['object'])
это output выглядит следующим образом -
Name
count 12
unique 12
top Ricky
freq 1
Теперь используйте следующий оператор и проверьте вывод -
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df. describe(include='all')
это output выглядит следующим образом -
Age Name Rating
count 12.000000 12 12.000000
unique NaN 12 NaN
top NaN Ricky NaN
freq NaN 1 NaN
mean 31.833333 NaN 3.743333
std 9.232682 NaN 0.661628
min 23.000000 NaN 2.560000
25% 25.000000 NaN 3.230000
50% 29.500000 NaN 3.790000
75% 35.500000 NaN 4.132500
max 51.000000 NaN 4.800000
Чтобы применить свои собственные или другие функции библиотеки к объектам Pandas, вы должны знать о трех важных методах. Эти методы обсуждаются ниже. Подходящий метод для использования зависит от того, ожидает ли ваша функция работы со всем DataFrame, по строкам или столбцам или по элементам.
- Табличное применение функции: pipe ()
- Применение мудрой функции строки или столбца: apply ()
- Элементарное применение функции: applymap ()
Табличное приложение функции
Пользовательские операции можно выполнять, передав функцию и соответствующее количество параметров в качестве аргументов канала. Таким образом, операция выполняется над всем DataFrame.
Например, добавьте значение 2 ко всем элементам в DataFrame. Потом,
функция сумматора
Функция сумматора складывает два числовых значения в качестве параметров и возвращает сумму.
def adder(ele1,ele2):
return ele1+ele2
Теперь мы будем использовать настраиваемую функцию для выполнения операции с DataFrame.
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.pipe(adder,2)
Посмотрим полную программу -
import pandas as pd
import numpy as np
def adder(ele1,ele2):
return ele1+ele2
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.pipe(adder,2)
print df.apply(np.mean)
это output выглядит следующим образом -
col1 col2 col3
0 2.176704 2.219691 1.509360
1 2.222378 2.422167 3.953921
2 2.241096 1.135424 2.696432
3 2.355763 0.376672 1.182570
4 2.308743 2.714767 2.130288
Применение мудрой функции строки или столбца
Произвольные функции могут применяться по осям DataFrame или Panel с помощью apply(), который, как и методы описательной статистики, принимает необязательный аргумент оси. По умолчанию операция выполняется по столбцам, принимая каждый столбец как массив.
Пример 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.apply(np.mean)
print df.apply(np.mean)
это output выглядит следующим образом -
col1 -0.288022
col2 1.044839
col3 -0.187009
dtype: float64
Мимо axis параметра, операции могут выполняться построчно.
Пример 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.apply(np.mean,axis=1)
print df.apply(np.mean)
это output выглядит следующим образом -
col1 0.034093
col2 -0.152672
col3 -0.229728
dtype: float64
Пример 3
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.apply(lambda x: x.max() - x.min())
print df.apply(np.mean)
это output выглядит следующим образом -
col1 -0.167413
col2 -0.370495
col3 -0.707631
dtype: float64
Приложение Element Wise Function
Не все функции могут быть векторизованы (ни массивы NumPy, которые возвращают другой массив, ни какое-либо значение), методы applymap() на DataFrame и analogously map() on Series принимают любую функцию Python, принимающую одно значение и возвращающую одно значение.
Пример 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
# My custom function
df['col1'].map(lambda x:x*100)
print df.apply(np.mean)
это output выглядит следующим образом -
col1 0.480742
col2 0.454185
col3 0.266563
dtype: float64
Пример 2
import pandas as pd
import numpy as np
# My custom function
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.applymap(lambda x:x*100)
print df.apply(np.mean)
это output выглядит следующим образом -
col1 0.395263
col2 0.204418
col3 -0.795188
dtype: float64
Reindexingизменяет метки строк и столбцов в DataFrame. Чтобы проиндексировать средства для согласования данных в соответствии с заданным набором меток вдоль определенной оси.
Несколько операций могут быть выполнены с помощью индексации, например:
Измените порядок существующих данных, чтобы они соответствовали новому набору меток.
Вставьте маркеры отсутствующего значения (NA) в те места метки, где не было данных для метки.
пример
import pandas as pd
import numpy as np
N=20
df = pd.DataFrame({
'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
'x': np.linspace(0,stop=N-1,num=N),
'y': np.random.rand(N),
'C': np.random.choice(['Low','Medium','High'],N).tolist(),
'D': np.random.normal(100, 10, size=(N)).tolist()
})
#reindex the DataFrame
df_reindexed = df.reindex(index=[0,2,5], columns=['A', 'C', 'B'])
print df_reindexed
это output выглядит следующим образом -
A C B
0 2016-01-01 Low NaN
2 2016-01-03 High NaN
5 2016-01-06 Low NaN
Переиндексировать, чтобы выровнять с другими объектами
Вы можете захотеть взять объект и переиндексировать его оси, чтобы они были помечены так же, как другой объект. Рассмотрим следующий пример, чтобы понять то же самое.
пример
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.random.randn(10,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(7,3),columns=['col1','col2','col3'])
df1 = df1.reindex_like(df2)
print df1
это output выглядит следующим образом -
col1 col2 col3
0 -2.467652 -1.211687 -0.391761
1 -0.287396 0.522350 0.562512
2 -0.255409 -0.483250 1.866258
3 -1.150467 -0.646493 -0.222462
4 0.152768 -2.056643 1.877233
5 -1.155997 1.528719 -1.343719
6 -1.015606 -1.245936 -0.295275
Note - Здесь df1 DataFrame изменен и переиндексирован как df2. Имена столбцов должны совпадать, иначе NAN будет добавлен для всей метки столбца.
Заполнение при переиндексировании
reindex() принимает необязательный метод параметра, который является методом заполнения следующими значениями:
pad/ffill - Заполнить значения вперед
bfill/backfill - Заполнить значения назад
nearest - Заполнение от ближайших значений индекса
пример
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])
# Padding NAN's
print df2.reindex_like(df1)
# Now Fill the NAN's with preceding Values
print ("Data Frame with Forward Fill:")
print df2.reindex_like(df1,method='ffill')
это output выглядит следующим образом -
col1 col2 col3
0 1.311620 -0.707176 0.599863
1 -0.423455 -0.700265 1.133371
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
Data Frame with Forward Fill:
col1 col2 col3
0 1.311620 -0.707176 0.599863
1 -0.423455 -0.700265 1.133371
2 -0.423455 -0.700265 1.133371
3 -0.423455 -0.700265 1.133371
4 -0.423455 -0.700265 1.133371
5 -0.423455 -0.700265 1.133371
Note - Последние четыре ряда заполнены.
Ограничения на заполнение при переиндексировании
Аргумент limit обеспечивает дополнительный контроль над заполнением при переиндексации. Лимит определяет максимальное количество последовательных совпадений. Давайте рассмотрим следующий пример, чтобы понять то же самое -
пример
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])
# Padding NAN's
print df2.reindex_like(df1)
# Now Fill the NAN's with preceding Values
print ("Data Frame with Forward Fill limiting to 1:")
print df2.reindex_like(df1,method='ffill',limit=1)
это output выглядит следующим образом -
col1 col2 col3
0 0.247784 2.128727 0.702576
1 -0.055713 -0.021732 -0.174577
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
Data Frame with Forward Fill limiting to 1:
col1 col2 col3
0 0.247784 2.128727 0.702576
1 -0.055713 -0.021732 -0.174577
2 -0.055713 -0.021732 -0.174577
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
Note- Обратите внимание, только 7-я строка заполняется предыдущей 6-й строкой. Затем строки остаются как есть.
Переименование
Метод rename () позволяет вам изменить метку оси на основе некоторого сопоставления (dict или Series) или произвольной функции.
Давайте рассмотрим следующий пример, чтобы понять это -
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
print df1
print ("After renaming the rows and columns:")
print df1.rename(columns={'col1' : 'c1', 'col2' : 'c2'},
index = {0 : 'apple', 1 : 'banana', 2 : 'durian'})
это output выглядит следующим образом -
col1 col2 col3
0 0.486791 0.105759 1.540122
1 -0.990237 1.007885 -0.217896
2 -0.483855 -1.645027 -1.194113
3 -0.122316 0.566277 -0.366028
4 -0.231524 -0.721172 -0.112007
5 0.438810 0.000225 0.435479
After renaming the rows and columns:
c1 c2 col3
apple 0.486791 0.105759 1.540122
banana -0.990237 1.007885 -0.217896
durian -0.483855 -1.645027 -1.194113
3 -0.122316 0.566277 -0.366028
4 -0.231524 -0.721172 -0.112007
5 0.438810 0.000225 0.435479
Метод rename () предоставляет inplaceименованный параметр, который по умолчанию имеет значение False и копирует базовые данные. Проходитьinplace=True чтобы переименовать данные на месте.
Поведение базовой итерации по объектам Pandas зависит от типа. При итерации по Серии она рассматривается как массив, и базовая итерация производит значения. Другие структуры данных, такие как DataFrame и Panel, соответствуютdict-like соглашение об итерации по keys объектов.
Короче говоря, базовая итерация (для i в объекте) производит -
Series - ценности
DataFrame - подписи столбцов
Panel - ярлыки предметов
Итерация DataFrame
Итерация DataFrame дает имена столбцов. Давайте рассмотрим следующий пример, чтобы понять то же самое.
import pandas as pd
import numpy as np
N=20
df = pd.DataFrame({
'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
'x': np.linspace(0,stop=N-1,num=N),
'y': np.random.rand(N),
'C': np.random.choice(['Low','Medium','High'],N).tolist(),
'D': np.random.normal(100, 10, size=(N)).tolist()
})
for col in df:
print col
это output выглядит следующим образом -
A
C
D
x
y
Чтобы перебирать строки DataFrame, мы можем использовать следующие функции:
iteritems() - перебирать пары (ключ, значение)
iterrows() - перебирать строки как пары (индекс, серия)
itertuples() - перебирать строки как именованные кортежи
iteritems ()
Итерации по каждому столбцу как пара ключ, значение с меткой как ключ и значение столбца как объект серии.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(4,3),columns=['col1','col2','col3'])
for key,value in df.iteritems():
print key,value
это output выглядит следующим образом -
col1 0 0.802390
1 0.324060
2 0.256811
3 0.839186
Name: col1, dtype: float64
col2 0 1.624313
1 -1.033582
2 1.796663
3 1.856277
Name: col2, dtype: float64
col3 0 -0.022142
1 -0.230820
2 1.160691
3 -0.830279
Name: col3, dtype: float64
Обратите внимание, каждый столбец повторяется отдельно как пара ключ-значение в серии.
iterrows ()
iterrows () возвращает итератор, дающий каждое значение индекса вместе с серией, содержащей данные в каждой строке.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
for row_index,row in df.iterrows():
print row_index,row
это output выглядит следующим образом -
0 col1 1.529759
col2 0.762811
col3 -0.634691
Name: 0, dtype: float64
1 col1 -0.944087
col2 1.420919
col3 -0.507895
Name: 1, dtype: float64
2 col1 -0.077287
col2 -0.858556
col3 -0.663385
Name: 2, dtype: float64
3 col1 -1.638578
col2 0.059866
col3 0.493482
Name: 3, dtype: float64
Note - Потому что iterrows()перебирать строки, он не сохраняет тип данных по строке. 0,1,2 - это индексы строк, а col1, col2, col3 - индексы столбцов.
itertuples ()
Метод itertuples () вернет итератор, дающий именованный кортеж для каждой строки в DataFrame. Первый элемент кортежа будет соответствующим значением индекса строки, а остальные значения - значениями строки.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
for row in df.itertuples():
print row
это output выглядит следующим образом -
Pandas(Index=0, col1=1.5297586201375899, col2=0.76281127433814944, col3=-
0.6346908238310438)
Pandas(Index=1, col1=-0.94408735763808649, col2=1.4209186418359423, col3=-
0.50789517967096232)
Pandas(Index=2, col1=-0.07728664756791935, col2=-0.85855574139699076, col3=-
0.6633852507207626)
Pandas(Index=3, col1=0.65734942534106289, col2=-0.95057710432604969,
col3=0.80344487462316527)
Note- Не пытайтесь изменить какой-либо объект во время итерации. Итерация предназначена для чтения, и итератор возвращает копию исходного объекта (представления), поэтому изменения не отразятся на исходном объекте.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
for index, row in df.iterrows():
row['a'] = 10
print df
это output выглядит следующим образом -
col1 col2 col3
0 -1.739815 0.735595 -0.295589
1 0.635485 0.106803 1.527922
2 -0.939064 0.547095 0.038585
3 -1.016509 -0.116580 -0.523158
Наблюдайте, никаких изменений не отражено.
В Pandas есть два вида сортировки. Они -
- По этикетке
- По фактической стоимости
Рассмотрим пример с выходом.
import pandas as pd
import numpy as np
unsorted_df=pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
mns=['col2','col1'])
print unsorted_df
это output выглядит следующим образом -
col2 col1
1 -2.063177 0.537527
4 0.142932 -0.684884
6 0.012667 -0.389340
2 -0.548797 1.848743
3 -1.044160 0.837381
5 0.385605 1.300185
9 1.031425 -1.002967
8 -0.407374 -0.435142
0 2.237453 -1.067139
7 -1.445831 -1.701035
В unsorted_df, то labels и valuesнесортированы. Давайте посмотрим, как их можно отсортировать.
По этикетке
Используя sort_index()DataFrame можно отсортировать, передав аргументы оси и порядок сортировки. По умолчанию сортировка выполняется по меткам строк в порядке возрастания.
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
mns = ['col2','col1'])
sorted_df=unsorted_df.sort_index()
print sorted_df
это output выглядит следующим образом -
col2 col1
0 0.208464 0.627037
1 0.641004 0.331352
2 -0.038067 -0.464730
3 -0.638456 -0.021466
4 0.014646 -0.737438
5 -0.290761 -1.669827
6 -0.797303 -0.018737
7 0.525753 1.628921
8 -0.567031 0.775951
9 0.060724 -0.322425
Порядок сортировки
Посредством передачи логического значения параметру по возрастанию можно управлять порядком сортировки. Давайте рассмотрим следующий пример, чтобы понять то же самое.
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
mns = ['col2','col1'])
sorted_df = unsorted_df.sort_index(ascending=False)
print sorted_df
это output выглядит следующим образом -
col2 col1
9 0.825697 0.374463
8 -1.699509 0.510373
7 -0.581378 0.622958
6 -0.202951 0.954300
5 -1.289321 -1.551250
4 1.302561 0.851385
3 -0.157915 -0.388659
2 -1.222295 0.166609
1 0.584890 -0.291048
0 0.668444 -0.061294
Сортировать столбцы
Передав аргументу оси значение 0 или 1, можно выполнить сортировку меток столбцов. По умолчанию ось = 0, сортировка по строке. Давайте рассмотрим следующий пример, чтобы понять то же самое.
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
mns = ['col2','col1'])
sorted_df=unsorted_df.sort_index(axis=1)
print sorted_df
это output выглядит следующим образом -
col1 col2
1 -0.291048 0.584890
4 0.851385 1.302561
6 0.954300 -0.202951
2 0.166609 -1.222295
3 -0.388659 -0.157915
5 -1.551250 -1.289321
9 0.374463 0.825697
8 0.510373 -1.699509
0 -0.061294 0.668444
7 0.622958 -0.581378
По значению
Как и сортировка по индексу, sort_values()это метод сортировки по значениям. Он принимает аргумент «by», который будет использовать имя столбца DataFrame, с которым должны быть отсортированы значения.
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
sorted_df = unsorted_df.sort_values(by='col1')
print sorted_df
это output выглядит следующим образом -
col1 col2
1 1 3
2 1 2
3 1 4
0 2 1
Обратите внимание, значения col1 сортируются, и соответствующее значение col2 и индекс строки изменятся вместе с col1. Таким образом, они выглядят несортированными.
'by' Аргумент принимает список значений столбца.
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
sorted_df = unsorted_df.sort_values(by=['col1','col2'])
print sorted_df
это output выглядит следующим образом -
col1 col2
2 1 2
1 1 3
3 1 4
0 2 1
Алгоритм сортировки
sort_values()предоставляет возможность выбора алгоритма из сортировки слиянием, сортировки в кучах и быстрой сортировки. Mergesort - единственный стабильный алгоритм.
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
sorted_df = unsorted_df.sort_values(by='col1' ,kind='mergesort')
print sorted_df
это output выглядит следующим образом -
col1 col2
1 1 3
2 1 2
3 1 4
0 2 1
В этой главе мы обсудим строковые операции с нашим базовым Series / Index. В следующих главах мы узнаем, как применять эти строковые функции к DataFrame.
Pandas предоставляет набор строковых функций, которые упрощают работу со строковыми данными. Что наиболее важно, эти функции игнорируют (или исключают) отсутствующие значения / NaN.
Почти все эти методы работают со строковыми функциями Python (см .: https://docs.python.org/3/library/stdtypes.html#string-methods). Итак, преобразуйте объект серии в объект String, а затем выполните операцию.
Давайте теперь посмотрим, как работает каждая операция.
Старший Нет | Описание функции |
---|---|
1 | lower() Преобразует строки в серии / указателе в нижний регистр. |
2 | upper() Преобразует строки в серии / указателе в верхний регистр. |
3 | len() Вычисляет длину строки (). |
4 | strip() Помогает удалить пробелы (включая новую строку) из каждой строки в серии / индексе с обеих сторон. |
5 | split(' ') Разбивает каждую строку заданным шаблоном. |
6 | cat(sep=' ') Объединяет элементы серии / индекса с заданным разделителем. |
7 | get_dummies() Возвращает DataFrame со значениями One-Hot Encoded. |
8 | contains(pattern) Возвращает логическое значение True для каждого элемента, если подстрока содержится в элементе, иначе False. |
9 | replace(a,b) Заменяет значение a со значением b. |
10 | repeat(value) Повторяет каждый элемент с указанным числом раз. |
11 | count(pattern) Возвращает количество появлений узора в каждом элементе. |
12 | startswith(pattern) Возвращает true, если элемент в серии / индексе начинается с шаблона. |
13 | endswith(pattern) Возвращает истину, если элемент в серии / индексе заканчивается шаблоном. |
14 | find(pattern) Возвращает первую позицию первого вхождения шаблона. |
15 | findall(pattern) Возвращает список всех вхождений шаблона. |
16 | swapcase Меняет местами регистр нижний / верхний. |
17 | islower() Проверяет, все ли символы в каждой строке в Серии / Индексе в нижнем регистре или нет. Возвращает логическое значение |
18 | isupper() Проверяет, все ли символы в каждой строке в Серии / Индексе в верхнем регистре или нет. Возвращает логическое значение. |
19 | isnumeric() Проверяет, все ли символы в каждой строке в Серии / Индексе являются числовыми. Возвращает логическое значение. |
Давайте теперь создадим серию и посмотрим, как работают все вышеперечисленные функции.
import pandas as pd
import numpy as np
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])
print s
это output выглядит следующим образом -
0 Tom
1 William Rick
2 John
3 Alber@t
4 NaN
5 1234
6 Steve Smith
dtype: object
нижний ()
import pandas as pd
import numpy as np
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])
print s.str.lower()
это output выглядит следующим образом -
0 tom
1 william rick
2 john
3 alber@t
4 NaN
5 1234
6 steve smith
dtype: object
верхний ()
import pandas as pd
import numpy as np
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])
print s.str.upper()
это output выглядит следующим образом -
0 TOM
1 WILLIAM RICK
2 JOHN
3 ALBER@T
4 NaN
5 1234
6 STEVE SMITH
dtype: object
len ()
import pandas as pd
import numpy as np
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])
print s.str.len()
это output выглядит следующим образом -
0 3.0
1 12.0
2 4.0
3 7.0
4 NaN
5 4.0
6 10.0
dtype: float64
полоса ()
import pandas as pd
import numpy as np
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s
print ("After Stripping:")
print s.str.strip()
это output выглядит следующим образом -
0 Tom
1 William Rick
2 John
3 Alber@t
dtype: object
After Stripping:
0 Tom
1 William Rick
2 John
3 Alber@t
dtype: object
сплит (узор)
import pandas as pd
import numpy as np
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s
print ("Split Pattern:")
print s.str.split(' ')
это output выглядит следующим образом -
0 Tom
1 William Rick
2 John
3 Alber@t
dtype: object
Split Pattern:
0 [Tom, , , , , , , , , , ]
1 [, , , , , William, Rick]
2 [John]
3 [Alber@t]
dtype: object
кошка (sep = шаблон)
import pandas as pd
import numpy as np
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s.str.cat(sep='_')
это output выглядит следующим образом -
Tom _ William Rick_John_Alber@t
get_dummies ()
import pandas as pd
import numpy as np
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s.str.get_dummies()
это output выглядит следующим образом -
William Rick Alber@t John Tom
0 0 0 0 1
1 1 0 0 0
2 0 0 1 0
3 0 1 0 0
содержит ()
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s.str.contains(' ')
это output выглядит следующим образом -
0 True
1 True
2 False
3 False
dtype: bool
заменить (а, б)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s
print ("After replacing @ with $:") print s.str.replace('@','$')
это output выглядит следующим образом -
0 Tom
1 William Rick
2 John
3 Alber@t
dtype: object
After replacing @ with $: 0 Tom 1 William Rick 2 John 3 Alber$t
dtype: object
повторить (значение)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s.str.repeat(2)
это output выглядит следующим образом -
0 Tom Tom
1 William Rick William Rick
2 JohnJohn
3 Alber@tAlber@t
dtype: object
количество (узор)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print ("The number of 'm's in each string:")
print s.str.count('m')
это output выглядит следующим образом -
The number of 'm's in each string:
0 1
1 1
2 0
3 0
начинается с (шаблон)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print ("Strings that start with 'T':")
print s.str. startswith ('T')
это output выглядит следующим образом -
0 True
1 False
2 False
3 False
dtype: bool
заканчивается (узор)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print ("Strings that end with 't':")
print s.str.endswith('t')
это output выглядит следующим образом -
Strings that end with 't':
0 False
1 False
2 False
3 True
dtype: bool
найти (шаблон)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s.str.find('e')
это output выглядит следующим образом -
0 -1
1 -1
2 -1
3 3
dtype: int64
«-1» означает, что в элементе нет такого шаблона.
findall (шаблон)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s.str.findall('e')
это output выглядит следующим образом -
0 []
1 []
2 []
3 [e]
dtype: object
Нулевой список ([]) означает, что в элементе нет такого шаблона.
swapcase ()
import pandas as pd
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])
print s.str.swapcase()
это output выглядит следующим образом -
0 tOM
1 wILLIAM rICK
2 jOHN
3 aLBER@T
dtype: object
islower ()
import pandas as pd
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])
print s.str.islower()
это output выглядит следующим образом -
0 False
1 False
2 False
3 False
dtype: bool
isupper ()
import pandas as pd
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])
print s.str.isupper()
это output выглядит следующим образом -
0 False
1 False
2 False
3 False
dtype: bool
isnumeric ()
import pandas as pd
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])
print s.str.isnumeric()
это output выглядит следующим образом -
0 False
1 False
2 False
3 False
dtype: bool
Pandas предоставляет API для настройки некоторых аспектов его поведения, в основном используется отображение.
API состоит из пяти соответствующих функций. Они -
- get_option()
- set_option()
- reset_option()
- describe_option()
- option_context()
Давайте теперь поймем, как работают функции.
get_option (параметр)
get_option принимает единственный параметр и возвращает значение, как указано в выводе ниже -
display.max_rows
Отображает количество значений по умолчанию. Интерпретатор считывает это значение и отображает строки с этим значением в качестве верхнего предела для отображения.
import pandas as pd
print pd.get_option("display.max_rows")
это output выглядит следующим образом -
60
display.max_columns
Отображает количество значений по умолчанию. Интерпретатор считывает это значение и отображает строки с этим значением в качестве верхнего предела для отображения.
import pandas as pd
print pd.get_option("display.max_columns")
это output выглядит следующим образом -
20
Здесь 60 и 20 - значения параметров конфигурации по умолчанию.
set_option (параметр, значение)
set_option принимает два аргумента и устанавливает значение параметра, как показано ниже -
display.max_rows
С помощью set_option(), мы можем изменить количество отображаемых строк по умолчанию.
import pandas as pd
pd.set_option("display.max_rows",80)
print pd.get_option("display.max_rows")
это output выглядит следующим образом -
80
display.max_columns
С помощью set_option(), мы можем изменить количество отображаемых строк по умолчанию.
import pandas as pd
pd.set_option("display.max_columns",30)
print pd.get_option("display.max_columns")
это output выглядит следующим образом -
30
reset_option (параметр)
reset_option принимает аргумент и возвращает значение по умолчанию.
display.max_rows
Используя reset_option (), мы можем изменить значение обратно на количество отображаемых строк по умолчанию.
import pandas as pd
pd.reset_option("display.max_rows")
print pd.get_option("display.max_rows")
это output выглядит следующим образом -
60
description_option (параметр)
describe_option печатает описание аргумента.
display.max_rows
Используя reset_option (), мы можем изменить значение обратно на количество отображаемых строк по умолчанию.
import pandas as pd
pd.describe_option("display.max_rows")
это output выглядит следующим образом -
display.max_rows : int
If max_rows is exceeded, switch to truncate view. Depending on
'large_repr', objects are either centrally truncated or printed as
a summary view. 'None' value means unlimited.
In case python/IPython is running in a terminal and `large_repr`
equals 'truncate' this can be set to 0 and pandas will auto-detect
the height of the terminal and print a truncated object which fits
the screen height. The IPython notebook, IPython qtconsole, or
IDLE do not run in a terminal and hence it is not possible to do
correct auto-detection.
[default: 60] [currently: 60]
option_context ()
option_context менеджер контекста используется для установки параметра в with statementвременно. Значения опций восстанавливаются автоматически при выходе изwith block -
display.max_rows
Используя option_context (), мы можем временно установить значение.
import pandas as pd
with pd.option_context("display.max_rows",10):
print(pd.get_option("display.max_rows"))
print(pd.get_option("display.max_rows"))
это output выглядит следующим образом -
10
10
Видите разницу между первым и вторым операторами печати. Первый оператор печатает значение, установленноеoption_context() что временно в пределах with contextсам. Послеwith context, второй оператор печати выводит настроенное значение.
Часто используемые параметры
Старший Нет | Параметр и описание |
---|---|
1 | display.max_rows Отображает максимальное количество строк для отображения |
2 | 2 display.max_columns Отображает максимальное количество отображаемых столбцов |
3 | display.expand_frame_repr Отображает фреймы данных для растягивания страниц |
4 | display.max_colwidth Отображает максимальную ширину столбца |
5 | display.precision Отображает точность десятичных чисел |
В этой главе мы обсудим, как разрезать дату и в целом получить подмножество объекта pandas.
Операторы индексирования Python и NumPy "[]" и оператор атрибута "." обеспечивают быстрый и легкий доступ к структурам данных Pandas в широком диапазоне вариантов использования. Однако, поскольку тип данных, к которым необходимо получить доступ, заранее неизвестен, прямое использование стандартных операторов имеет некоторые ограничения оптимизации. Для производственного кода мы рекомендуем вам воспользоваться оптимизированными методами доступа к данным pandas, описанными в этой главе.
Pandas теперь поддерживает три типа многоосной индексации; три типа упомянуты в следующей таблице -
Старший Нет | Индексирование и описание |
---|---|
1 | .loc() Этикетка на основе |
2 | .iloc() Целочисленный |
3 | .ix() На основе меток и целых чисел |
.loc ()
Панды предоставляют различные методы чисто label based indexing. При нарезке также включается начальная граница. Целые числа являются допустимыми метками, но они относятся к метке, а не к позиции.
.loc() имеет несколько методов доступа, таких как -
- Одна скалярная метка
- Список этикеток
- Объект-срез
- Логический массив
locпринимает два оператора single / list / range, разделенных ','. Первый указывает строку, а второй - столбцы.
Пример 1
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
#select all rows for a specific column
print df.loc[:,'A']
это output выглядит следующим образом -
a 0.391548
b -0.070649
c -0.317212
d -2.162406
e 2.202797
f 0.613709
g 1.050559
h 1.122680
Name: A, dtype: float64
Пример 2
# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
# Select all rows for multiple columns, say list[]
print df.loc[:,['A','C']]
это output выглядит следующим образом -
A C
a 0.391548 0.745623
b -0.070649 1.620406
c -0.317212 1.448365
d -2.162406 -0.873557
e 2.202797 0.528067
f 0.613709 0.286414
g 1.050559 0.216526
h 1.122680 -1.621420
Пример 3
# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
# Select few rows for multiple columns, say list[]
print df.loc[['a','b','f','h'],['A','C']]
это output выглядит следующим образом -
A C
a 0.391548 0.745623
b -0.070649 1.620406
f 0.613709 0.286414
h 1.122680 -1.621420
Пример 4
# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
# Select range of rows for all columns
print df.loc['a':'h']
это output выглядит следующим образом -
A B C D
a 0.391548 -0.224297 0.745623 0.054301
b -0.070649 -0.880130 1.620406 1.419743
c -0.317212 -1.929698 1.448365 0.616899
d -2.162406 0.614256 -0.873557 1.093958
e 2.202797 -2.315915 0.528067 0.612482
f 0.613709 -0.157674 0.286414 -0.500517
g 1.050559 -2.272099 0.216526 0.928449
h 1.122680 0.324368 -1.621420 -0.741470
Пример 5
# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
# for getting values with a boolean array
print df.loc['a']>0
это output выглядит следующим образом -
A False
B True
C False
D False
Name: a, dtype: bool
.iloc ()
Pandas предоставляет различные методы для получения полностью целочисленной индексации. Как и python и numpy, это0-based индексация.
Различные методы доступа следующие:
- Целое число
- Список целых чисел
- Диапазон значений
Пример 1
# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
# select all rows for a specific column
print df.iloc[:4]
это output выглядит следующим образом -
A B C D
0 0.699435 0.256239 -1.270702 -0.645195
1 -0.685354 0.890791 -0.813012 0.631615
2 -0.783192 -0.531378 0.025070 0.230806
3 0.539042 -1.284314 0.826977 -0.026251
Пример 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
# Integer slicing
print df.iloc[:4]
print df.iloc[1:5, 2:4]
это output выглядит следующим образом -
A B C D
0 0.699435 0.256239 -1.270702 -0.645195
1 -0.685354 0.890791 -0.813012 0.631615
2 -0.783192 -0.531378 0.025070 0.230806
3 0.539042 -1.284314 0.826977 -0.026251
C D
1 -0.813012 0.631615
2 0.025070 0.230806
3 0.826977 -0.026251
4 1.423332 1.130568
Пример 3
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
# Slicing through list of values
print df.iloc[[1, 3, 5], [1, 3]]
print df.iloc[1:3, :]
print df.iloc[:,1:3]
это output выглядит следующим образом -
B D
1 0.890791 0.631615
3 -1.284314 -0.026251
5 -0.512888 -0.518930
A B C D
1 -0.685354 0.890791 -0.813012 0.631615
2 -0.783192 -0.531378 0.025070 0.230806
B C
0 0.256239 -1.270702
1 0.890791 -0.813012
2 -0.531378 0.025070
3 -1.284314 0.826977
4 -0.460729 1.423332
5 -0.512888 0.581409
6 -1.204853 0.098060
7 -0.947857 0.641358
.ix ()
Помимо чистых меток и целых чисел, Pandas предоставляет гибридный метод для выбора и подмножества объекта с помощью оператора .ix ().
Пример 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
# Integer slicing
print df.ix[:4]
это output выглядит следующим образом -
A B C D
0 0.699435 0.256239 -1.270702 -0.645195
1 -0.685354 0.890791 -0.813012 0.631615
2 -0.783192 -0.531378 0.025070 0.230806
3 0.539042 -1.284314 0.826977 -0.026251
Пример 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
# Index slicing
print df.ix[:,'A']
это output выглядит следующим образом -
0 0.699435
1 -0.685354
2 -0.783192
3 0.539042
4 -1.044209
5 -1.415411
6 1.062095
7 0.994204
Name: A, dtype: float64
Использование обозначений
Получение значений из объекта Pandas с многоосной индексацией использует следующие обозначения:
Объект | Индексаторы | Тип возврата |
---|---|---|
Серии | s.loc [индексатор] | Скалярное значение |
DataFrame | df.loc [row_index, col_index] | Объект серии |
Панель | p.loc [item_index, major_index, minor_index] | p.loc [item_index, major_index, minor_index] |
Note − .iloc() & .ix() применяет те же параметры индексации и возвращаемое значение.
Давайте теперь посмотрим, как каждая операция может быть выполнена с объектом DataFrame. Мы будем использовать основной оператор индексации '[]' -
Пример 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print df['A']
это output выглядит следующим образом -
0 -0.478893
1 0.391931
2 0.336825
3 -1.055102
4 -0.165218
5 -0.328641
6 0.567721
7 -0.759399
Name: A, dtype: float64
Note - Мы можем передать список значений в [], чтобы выбрать эти столбцы.
Пример 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print df[['A','B']]
это output выглядит следующим образом -
A B
0 -0.478893 -0.606311
1 0.391931 -0.949025
2 0.336825 0.093717
3 -1.055102 -0.012944
4 -0.165218 1.550310
5 -0.328641 -0.226363
6 0.567721 -0.312585
7 -0.759399 -0.372696
Пример 3
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print df[2:2]
это output выглядит следующим образом -
Columns: [A, B, C, D]
Index: []
Доступ к атрибутам
Столбцы можно выбрать с помощью оператора атрибута '.'.
пример
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print df.A
это output выглядит следующим образом -
0 -0.478893
1 0.391931
2 0.336825
3 -1.055102
4 -0.165218
5 -0.328641
6 0.567721
7 -0.759399
Name: A, dtype: float64
Статистические методы помогают понять и проанализировать поведение данных. Теперь мы изучим несколько статистических функций, которые мы можем применить к объектам Pandas.
Percent_change
Series, DatFrames и Panel - все имеют функцию pct_change(). Эта функция сравнивает каждый элемент с его предыдущим элементом и вычисляет процент изменения.
import pandas as pd
import numpy as np
s = pd.Series([1,2,3,4,5,4])
print s.pct_change()
df = pd.DataFrame(np.random.randn(5, 2))
print df.pct_change()
это output выглядит следующим образом -
0 NaN
1 1.000000
2 0.500000
3 0.333333
4 0.250000
5 -0.200000
dtype: float64
0 1
0 NaN NaN
1 -15.151902 0.174730
2 -0.746374 -1.449088
3 -3.582229 -3.165836
4 15.601150 -1.860434
По умолчанию pct_change()действует на колонны; если вы хотите применить одну и ту же строку, используйтеaxis=1() аргумент.
Ковариация
Ковариация применяется к данным ряда. Объект Series имеет метод cov для вычисления ковариации между объектами серии. NA будет исключен автоматически.
Cov серии
import pandas as pd
import numpy as np
s1 = pd.Series(np.random.randn(10))
s2 = pd.Series(np.random.randn(10))
print s1.cov(s2)
это output выглядит следующим образом -
-0.12978405324
Метод ковариации при применении к DataFrame вычисляет cov между всеми столбцами.
import pandas as pd
import numpy as np
frame = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
print frame['a'].cov(frame['b'])
print frame.cov()
это output выглядит следующим образом -
-0.58312921152741437
a b c d e
a 1.780628 -0.583129 -0.185575 0.003679 -0.136558
b -0.583129 1.297011 0.136530 -0.523719 0.251064
c -0.185575 0.136530 0.915227 -0.053881 -0.058926
d 0.003679 -0.523719 -0.053881 1.521426 -0.487694
e -0.136558 0.251064 -0.058926 -0.487694 0.960761
Note - Соблюдайте cov между a и b столбец в первом операторе, и это значение, возвращаемое cov в DataFrame.
Корреляция
Корреляция показывает линейную зависимость между любыми двумя массивами значений (сериями). Есть несколько методов для вычисления корреляции, например, pearson (по умолчанию), spearman и kendall.
import pandas as pd
import numpy as np
frame = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
print frame['a'].corr(frame['b'])
print frame.corr()
это output выглядит следующим образом -
-0.383712785514
a b c d e
a 1.000000 -0.383713 -0.145368 0.002235 -0.104405
b -0.383713 1.000000 0.125311 -0.372821 0.224908
c -0.145368 0.125311 1.000000 -0.045661 -0.062840
d 0.002235 -0.372821 -0.045661 1.000000 -0.403380
e -0.104405 0.224908 -0.062840 -0.403380 1.000000
Если в DataFrame присутствует какой-либо нечисловой столбец, он автоматически исключается.
Ранжирование данных
Ранжирование данных производит ранжирование для каждого элемента в массиве элементов. В случае ничьей присваивает средний ранг.
import pandas as pd
import numpy as np
s = pd.Series(np.random.np.random.randn(5), index=list('abcde'))
s['d'] = s['b'] # so there's a tie
print s.rank()
это output выглядит следующим образом -
a 1.0
b 3.5
c 2.0
d 3.5
e 5.0
dtype: float64
Ранг необязательно принимает параметр по возрастанию, который по умолчанию равен true; если false, данные ранжируются в обратном порядке, при этом большим значениям присваивается меньший ранг.
Rank поддерживает различные методы разрешения конфликтов, указанные с помощью параметра метода -
average - средний рейтинг равной группы
min - самый низкий рейтинг в группе
max - высшее место в группе
first - ранги присваиваются в порядке их появления в массиве
Для работы с числовыми данными Pandas предоставляет несколько вариантов, таких как вращение, расширение и экспоненциальное перемещение весов для оконной статистики. Среди нихsum, mean, median, variance, covariance, correlation, и т.п.
Теперь мы узнаем, как каждый из них можно применить к объектам DataFrame.
.rolling () Функция
Эта функция может применяться к серии данных. Укажитеwindow=n аргумент и примените к нему соответствующую статистическую функцию.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df.rolling(window=3).mean()
это output выглядит следующим образом -
A B C D
2000-01-01 NaN NaN NaN NaN
2000-01-02 NaN NaN NaN NaN
2000-01-03 0.434553 -0.667940 -1.051718 -0.826452
2000-01-04 0.628267 -0.047040 -0.287467 -0.161110
2000-01-05 0.398233 0.003517 0.099126 -0.405565
2000-01-06 0.641798 0.656184 -0.322728 0.428015
2000-01-07 0.188403 0.010913 -0.708645 0.160932
2000-01-08 0.188043 -0.253039 -0.818125 -0.108485
2000-01-09 0.682819 -0.606846 -0.178411 -0.404127
2000-01-10 0.688583 0.127786 0.513832 -1.067156
Note - Поскольку размер окна равен 3, для первых двух элементов есть нули, а с третьего значения будет средним значением n, n-1 и n-2элементы. Таким образом, мы также можем применять различные функции, упомянутые выше.
.expanding () Функция
Эта функция может применяться к серии данных. Укажитеmin_periods=n аргумент и примените к нему соответствующую статистическую функцию.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df.expanding(min_periods=3).mean()
это output выглядит следующим образом -
A B C D
2000-01-01 NaN NaN NaN NaN
2000-01-02 NaN NaN NaN NaN
2000-01-03 0.434553 -0.667940 -1.051718 -0.826452
2000-01-04 0.743328 -0.198015 -0.852462 -0.262547
2000-01-05 0.614776 -0.205649 -0.583641 -0.303254
2000-01-06 0.538175 -0.005878 -0.687223 -0.199219
2000-01-07 0.505503 -0.108475 -0.790826 -0.081056
2000-01-08 0.454751 -0.223420 -0.671572 -0.230215
2000-01-09 0.586390 -0.206201 -0.517619 -0.267521
2000-01-10 0.560427 -0.037597 -0.399429 -0.376886
.ewm () Функция
ewmприменяется к серии данных. Укажите любое из com, span,halflifeаргумент и примените к нему соответствующую статистическую функцию. Он присваивает веса экспоненциально.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df.ewm(com=0.5).mean()
это output выглядит следующим образом -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 0.865131 -0.453626 -1.137961 0.058747
2000-01-03 -0.132245 -0.807671 -0.308308 -1.491002
2000-01-04 1.084036 0.555444 -0.272119 0.480111
2000-01-05 0.425682 0.025511 0.239162 -0.153290
2000-01-06 0.245094 0.671373 -0.725025 0.163310
2000-01-07 0.288030 -0.259337 -1.183515 0.473191
2000-01-08 0.162317 -0.771884 -0.285564 -0.692001
2000-01-09 1.147156 -0.302900 0.380851 -0.607976
2000-01-10 0.600216 0.885614 0.569808 -1.110113
Оконные функции в основном используются для нахождения трендов в данных графически путем сглаживания кривой. Если в повседневных данных много вариаций и доступно много точек данных, то взятие образцов и построение графика - это один метод, а применение оконных вычислений и построение графика по результатам - другой метод. С помощью этих методов мы можем сгладить кривую или тренд.
Как только катится, расширяется и ewm создаются объекты, доступно несколько методов для агрегирования данных.
Применение агрегатов к DataFrame
Давайте создадим DataFrame и применим к нему агрегаты.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r
это output выглядит следующим образом -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 0.790670 -0.387854 -0.668132 0.267283
2000-01-03 -0.575523 -0.965025 0.060427 -2.179780
2000-01-04 1.669653 1.211759 -0.254695 1.429166
2000-01-05 0.100568 -0.236184 0.491646 -0.466081
2000-01-06 0.155172 0.992975 -1.205134 0.320958
2000-01-07 0.309468 -0.724053 -1.412446 0.627919
2000-01-08 0.099489 -1.028040 0.163206 -1.274331
2000-01-09 1.639500 -0.068443 0.714008 -0.565969
2000-01-10 0.326761 1.479841 0.664282 -1.361169
Rolling [window=3,min_periods=1,center=False,axis=0]
Мы можем агрегировать, передав функцию всему DataFrame или выбирая столбец с помощью стандартного get item метод.
Применение агрегирования ко всему фрейму данных
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r.aggregate(np.sum)
это output выглядит следующим образом -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 1.879182 -1.038796 -3.215581 -0.299575
2000-01-03 1.303660 -2.003821 -3.155154 -2.479355
2000-01-04 1.884801 -0.141119 -0.862400 -0.483331
2000-01-05 1.194699 0.010551 0.297378 -1.216695
2000-01-06 1.925393 1.968551 -0.968183 1.284044
2000-01-07 0.565208 0.032738 -2.125934 0.482797
2000-01-08 0.564129 -0.759118 -2.454374 -0.325454
2000-01-09 2.048458 -1.820537 -0.535232 -1.212381
2000-01-10 2.065750 0.383357 1.541496 -3.201469
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 1.879182 -1.038796 -3.215581 -0.299575
2000-01-03 1.303660 -2.003821 -3.155154 -2.479355
2000-01-04 1.884801 -0.141119 -0.862400 -0.483331
2000-01-05 1.194699 0.010551 0.297378 -1.216695
2000-01-06 1.925393 1.968551 -0.968183 1.284044
2000-01-07 0.565208 0.032738 -2.125934 0.482797
2000-01-08 0.564129 -0.759118 -2.454374 -0.325454
2000-01-09 2.048458 -1.820537 -0.535232 -1.212381
2000-01-10 2.065750 0.383357 1.541496 -3.201469
Применение агрегирования к одному столбцу фрейма данных
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r['A'].aggregate(np.sum)
это output выглядит следующим образом -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 1.879182 -1.038796 -3.215581 -0.299575
2000-01-03 1.303660 -2.003821 -3.155154 -2.479355
2000-01-04 1.884801 -0.141119 -0.862400 -0.483331
2000-01-05 1.194699 0.010551 0.297378 -1.216695
2000-01-06 1.925393 1.968551 -0.968183 1.284044
2000-01-07 0.565208 0.032738 -2.125934 0.482797
2000-01-08 0.564129 -0.759118 -2.454374 -0.325454
2000-01-09 2.048458 -1.820537 -0.535232 -1.212381
2000-01-10 2.065750 0.383357 1.541496 -3.201469
2000-01-01 1.088512
2000-01-02 1.879182
2000-01-03 1.303660
2000-01-04 1.884801
2000-01-05 1.194699
2000-01-06 1.925393
2000-01-07 0.565208
2000-01-08 0.564129
2000-01-09 2.048458
2000-01-10 2.065750
Freq: D, Name: A, dtype: float64
Применение агрегирования к нескольким столбцам фрейма данных
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r[['A','B']].aggregate(np.sum)
это output выглядит следующим образом -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 1.879182 -1.038796 -3.215581 -0.299575
2000-01-03 1.303660 -2.003821 -3.155154 -2.479355
2000-01-04 1.884801 -0.141119 -0.862400 -0.483331
2000-01-05 1.194699 0.010551 0.297378 -1.216695
2000-01-06 1.925393 1.968551 -0.968183 1.284044
2000-01-07 0.565208 0.032738 -2.125934 0.482797
2000-01-08 0.564129 -0.759118 -2.454374 -0.325454
2000-01-09 2.048458 -1.820537 -0.535232 -1.212381
2000-01-10 2.065750 0.383357 1.541496 -3.201469
A B
2000-01-01 1.088512 -0.650942
2000-01-02 1.879182 -1.038796
2000-01-03 1.303660 -2.003821
2000-01-04 1.884801 -0.141119
2000-01-05 1.194699 0.010551
2000-01-06 1.925393 1.968551
2000-01-07 0.565208 0.032738
2000-01-08 0.564129 -0.759118
2000-01-09 2.048458 -1.820537
2000-01-10 2.065750 0.383357
Применение нескольких функций к одному столбцу фрейма данных
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r['A'].aggregate([np.sum,np.mean])
это output выглядит следующим образом -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 1.879182 -1.038796 -3.215581 -0.299575
2000-01-03 1.303660 -2.003821 -3.155154 -2.479355
2000-01-04 1.884801 -0.141119 -0.862400 -0.483331
2000-01-05 1.194699 0.010551 0.297378 -1.216695
2000-01-06 1.925393 1.968551 -0.968183 1.284044
2000-01-07 0.565208 0.032738 -2.125934 0.482797
2000-01-08 0.564129 -0.759118 -2.454374 -0.325454
2000-01-09 2.048458 -1.820537 -0.535232 -1.212381
2000-01-10 2.065750 0.383357 1.541496 -3.201469
sum mean
2000-01-01 1.088512 1.088512
2000-01-02 1.879182 0.939591
2000-01-03 1.303660 0.434553
2000-01-04 1.884801 0.628267
2000-01-05 1.194699 0.398233
2000-01-06 1.925393 0.641798
2000-01-07 0.565208 0.188403
2000-01-08 0.564129 0.188043
2000-01-09 2.048458 0.682819
2000-01-10 2.065750 0.688583
Применение нескольких функций к нескольким столбцам фрейма данных
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r[['A','B']].aggregate([np.sum,np.mean])
это output выглядит следующим образом -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 1.879182 -1.038796 -3.215581 -0.299575
2000-01-03 1.303660 -2.003821 -3.155154 -2.479355
2000-01-04 1.884801 -0.141119 -0.862400 -0.483331
2000-01-05 1.194699 0.010551 0.297378 -1.216695
2000-01-06 1.925393 1.968551 -0.968183 1.284044
2000-01-07 0.565208 0.032738 -2.125934 0.482797
2000-01-08 0.564129 -0.759118 -2.454374 -0.325454
2000-01-09 2.048458 -1.820537 -0.535232 -1.212381
2000-01-10 2.065750 0.383357 1.541496 -3.201469
A B
sum mean sum mean
2000-01-01 1.088512 1.088512 -0.650942 -0.650942
2000-01-02 1.879182 0.939591 -1.038796 -0.519398
2000-01-03 1.303660 0.434553 -2.003821 -0.667940
2000-01-04 1.884801 0.628267 -0.141119 -0.047040
2000-01-05 1.194699 0.398233 0.010551 0.003517
2000-01-06 1.925393 0.641798 1.968551 0.656184
2000-01-07 0.565208 0.188403 0.032738 0.010913
2000-01-08 0.564129 0.188043 -0.759118 -0.253039
2000-01-09 2.048458 0.682819 -1.820537 -0.606846
2000-01-10 2.065750 0.688583 0.383357 0.127786
Применение разных функций к разным столбцам фрейма данных
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3, 4),
index = pd.date_range('1/1/2000', periods=3),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r.aggregate({'A' : np.sum,'B' : np.mean})
это output выглядит следующим образом -
A B C D
2000-01-01 -1.575749 -1.018105 0.317797 0.545081
2000-01-02 -0.164917 -1.361068 0.258240 1.113091
2000-01-03 1.258111 1.037941 -0.047487 0.867371
A B
2000-01-01 -1.575749 -1.018105
2000-01-02 -1.740666 -1.189587
2000-01-03 -0.482555 -0.447078
Отсутствие данных всегда является проблемой в сценариях реальной жизни. Такие области, как машинное обучение и интеллектуальный анализ данных, сталкиваются с серьезными проблемами с точностью прогнозов их моделей из-за низкого качества данных, вызванного отсутствием значений. В этих областях обработка пропущенных значений является основным направлением, чтобы сделать их модели более точными и достоверными.
Когда и почему данные отсутствуют?
Давайте рассмотрим онлайн-опрос по продукту. Часто люди не делятся всей связанной с ними информацией. Мало кто делится своим опытом, но не тем, как долго они пользуются продуктом; немногие люди рассказывают, как долго они используют продукт, своим опытом, но не своей контактной информацией. Таким образом, так или иначе часть данных всегда отсутствует, и это очень часто встречается в режиме реального времени.
Давайте теперь посмотрим, как мы можем обрабатывать отсутствующие значения (скажем, NA или NaN) с помощью Pandas.
# import the pandas library
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df
это output выглядит следующим образом -
one two three
a 0.077988 0.476149 0.965836
b NaN NaN NaN
c -0.390208 -0.551605 -2.301950
d NaN NaN NaN
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
g NaN NaN NaN
h 0.085100 0.532791 0.887415
Используя переиндексирование, мы создали DataFrame с пропущенными значениями. На выходеNaN средства Not a Number.
Проверьте отсутствующие значения
Чтобы упростить обнаружение отсутствующих значений (и для разных типов массивов), Pandas предоставляет isnull() и notnull() функции, которые также являются методами для объектов Series и DataFrame -
Пример 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df['one'].isnull()
это output выглядит следующим образом -
a False
b True
c False
d True
e False
f False
g True
h False
Name: one, dtype: bool
Пример 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df['one'].notnull()
это output выглядит следующим образом -
a True
b False
c True
d False
e True
f True
g False
h True
Name: one, dtype: bool
Расчеты с отсутствующими данными
- При суммировании данных NA будет рассматриваться как ноль.
- Если все данные NA, то результатом будет NA.
Пример 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df['one'].sum()
это output выглядит следующим образом -
2.02357685917
Пример 2
import pandas as pd
import numpy as np
df = pd.DataFrame(index=[0,1,2,3,4,5],columns=['one','two'])
print df['one'].sum()
это output выглядит следующим образом -
nan
Очистка / заполнение недостающих данных
Pandas предоставляет различные методы для очистки недостающих значений. Функция fillna может «заполнять» значения NA ненулевыми данными двумя способами, которые мы проиллюстрировали в следующих разделах.
Заменить NaN скалярным значением
Следующая программа показывает, как можно заменить «NaN» на «0».
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3, 3), index=['a', 'c', 'e'],columns=['one',
'two', 'three'])
df = df.reindex(['a', 'b', 'c'])
print df
print ("NaN replaced with '0':")
print df.fillna(0)
это output выглядит следующим образом -
one two three
a -0.576991 -0.741695 0.553172
b NaN NaN NaN
c 0.744328 -1.735166 1.749580
NaN replaced with '0':
one two three
a -0.576991 -0.741695 0.553172
b 0.000000 0.000000 0.000000
c 0.744328 -1.735166 1.749580
Здесь мы заполняем нулевым значением; вместо этого мы также можем заполнить любое другое значение.
Заполнить NA вперед и назад
Используя концепции заполнения, обсуждаемые в главе «Переиндексирование», мы заполним недостающие значения.
Старший Нет | Метод и действие |
---|---|
1 | pad/fill Методы заливки Вперед |
2 | bfill/backfill Методы заливки Назад |
Пример 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.fillna(method='pad')
это output выглядит следующим образом -
one two three
a 0.077988 0.476149 0.965836
b 0.077988 0.476149 0.965836
c -0.390208 -0.551605 -2.301950
d -0.390208 -0.551605 -2.301950
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
g -0.930230 -0.670473 1.146615
h 0.085100 0.532791 0.887415
Пример 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.fillna(method='backfill')
это output выглядит следующим образом -
one two three
a 0.077988 0.476149 0.965836
b -0.390208 -0.551605 -2.301950
c -0.390208 -0.551605 -2.301950
d -2.000303 -0.788201 1.510072
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
g 0.085100 0.532791 0.887415
h 0.085100 0.532791 0.887415
Отбросьте отсутствующие значения
Если вы хотите просто исключить отсутствующие значения, используйте dropna функции вместе с axisаргумент. По умолчанию ось = 0, т. Е. Вдоль строки, что означает, что если какое-либо значение в строке имеет значение NA, то вся строка исключается.
Пример 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.dropna()
это output выглядит следующим образом -
one two three
a 0.077988 0.476149 0.965836
c -0.390208 -0.551605 -2.301950
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
h 0.085100 0.532791 0.887415
Пример 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.dropna(axis=1)
это output выглядит следующим образом -
Empty DataFrame
Columns: [ ]
Index: [a, b, c, d, e, f, g, h]
Заменить отсутствующие (или) общие значения
Часто нам приходится заменять общее значение некоторым конкретным значением. Мы можем добиться этого, применив метод замены.
Замена NA на скалярное значение эквивалентно поведению fillna() функция.
Пример 1
import pandas as pd
import numpy as np
df = pd.DataFrame({'one':[10,20,30,40,50,2000], 'two':[1000,0,30,40,50,60]})
print df.replace({1000:10,2000:60})
это output выглядит следующим образом -
one two
0 10 10
1 20 0
2 30 30
3 40 40
4 50 50
5 60 60
Пример 2
import pandas as pd
import numpy as np
df = pd.DataFrame({'one':[10,20,30,40,50,2000], 'two':[1000,0,30,40,50,60]})
print df.replace({1000:10,2000:60})
это output выглядит следующим образом -
one two
0 10 10
1 20 0
2 30 30
3 40 40
4 50 50
5 60 60
Любые groupbyоперация включает в себя одну из следующих операций над исходным объектом. Они -
Splitting предмет
Applying функция
Combining результаты
Во многих ситуациях мы разделяем данные на наборы и применяем некоторые функции к каждому подмножеству. В функции применения мы можем выполнять следующие операции:
Aggregation - вычисление сводной статистики
Transformation - выполнить некоторую групповую операцию
Filtration - отбрасывание данных с некоторым условием
Давайте теперь создадим объект DataFrame и выполним с ним все операции -
#import the pandas library
import pandas as pd
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
print df
это output выглядит следующим образом -
Points Rank Team Year
0 876 1 Riders 2014
1 789 2 Riders 2015
2 863 2 Devils 2014
3 673 3 Devils 2015
4 741 3 Kings 2014
5 812 4 kings 2015
6 756 1 Kings 2016
7 788 1 Kings 2017
8 694 2 Riders 2016
9 701 4 Royals 2014
10 804 1 Royals 2015
11 690 2 Riders 2017
Разделить данные на группы
Объект Pandas можно разделить на любой из своих объектов. Есть несколько способов разделить объект, например -
- obj.groupby('key')
- obj.groupby(['key1','key2'])
- obj.groupby(key,axis=1)
Давайте теперь посмотрим, как группирующие объекты могут быть применены к объекту DataFrame.
пример
# import the pandas library
import pandas as pd
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
print df.groupby('Team')
это output выглядит следующим образом -
<pandas.core.groupby.DataFrameGroupBy object at 0x7fa46a977e50>
Просмотр групп
# import the pandas library
import pandas as pd
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
print df.groupby('Team').groups
это output выглядит следующим образом -
{'Kings': Int64Index([4, 6, 7], dtype='int64'),
'Devils': Int64Index([2, 3], dtype='int64'),
'Riders': Int64Index([0, 1, 8, 11], dtype='int64'),
'Royals': Int64Index([9, 10], dtype='int64'),
'kings' : Int64Index([5], dtype='int64')}
пример
Group by с несколькими столбцами -
# import the pandas library
import pandas as pd
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
print df.groupby(['Team','Year']).groups
это output выглядит следующим образом -
{('Kings', 2014): Int64Index([4], dtype='int64'),
('Royals', 2014): Int64Index([9], dtype='int64'),
('Riders', 2014): Int64Index([0], dtype='int64'),
('Riders', 2015): Int64Index([1], dtype='int64'),
('Kings', 2016): Int64Index([6], dtype='int64'),
('Riders', 2016): Int64Index([8], dtype='int64'),
('Riders', 2017): Int64Index([11], dtype='int64'),
('Devils', 2014): Int64Index([2], dtype='int64'),
('Devils', 2015): Int64Index([3], dtype='int64'),
('kings', 2015): Int64Index([5], dtype='int64'),
('Royals', 2015): Int64Index([10], dtype='int64'),
('Kings', 2017): Int64Index([7], dtype='int64')}
Итерация по группам
С groupby объект в руке, мы можем перебирать объект, аналогично itertools.obj.
# import the pandas library
import pandas as pd
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
grouped = df.groupby('Year')
for name,group in grouped:
print name
print group
это output выглядит следующим образом -
2014
Points Rank Team Year
0 876 1 Riders 2014
2 863 2 Devils 2014
4 741 3 Kings 2014
9 701 4 Royals 2014
2015
Points Rank Team Year
1 789 2 Riders 2015
3 673 3 Devils 2015
5 812 4 kings 2015
10 804 1 Royals 2015
2016
Points Rank Team Year
6 756 1 Kings 2016
8 694 2 Riders 2016
2017
Points Rank Team Year
7 788 1 Kings 2017
11 690 2 Riders 2017
По умолчанию groupby объект имеет то же имя метки, что и имя группы.
Выберите группу
Используя get_group() метод, мы можем выбрать одну группу.
# import the pandas library
import pandas as pd
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
grouped = df.groupby('Year')
print grouped.get_group(2014)
это output выглядит следующим образом -
Points Rank Team Year
0 876 1 Riders 2014
2 863 2 Devils 2014
4 741 3 Kings 2014
9 701 4 Royals 2014
Агрегаты
Агрегированная функция возвращает единое агрегированное значение для каждой группы. Однаждыgroup by создается объект, можно выполнить несколько операций агрегирования с сгруппированными данными.
Очевидным является агрегирование через агрегат или эквивалент agg метод -
# import the pandas library
import pandas as pd
import numpy as np
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
grouped = df.groupby('Year')
print grouped['Points'].agg(np.mean)
это output выглядит следующим образом -
Year
2014 795.25
2015 769.50
2016 725.00
2017 739.00
Name: Points, dtype: float64
Другой способ узнать размер каждой группы - применить функцию size () -
import pandas as pd
import numpy as np
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
Attribute Access in Python Pandas
grouped = df.groupby('Team')
print grouped.agg(np.size)
это output выглядит следующим образом -
Points Rank Year
Team
Devils 2 2 2
Kings 3 3 3
Riders 4 4 4
Royals 2 2 2
kings 1 1 1
Одновременное применение нескольких функций агрегирования
С сгруппированными сериями вы также можете пройти list или же dict of functions для агрегации и создания DataFrame в качестве вывода -
# import the pandas library
import pandas as pd
import numpy as np
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
grouped = df.groupby('Team')
print grouped['Points'].agg([np.sum, np.mean, np.std])
это output выглядит следующим образом -
Team sum mean std
Devils 1536 768.000000 134.350288
Kings 2285 761.666667 24.006943
Riders 3049 762.250000 88.567771
Royals 1505 752.500000 72.831998
kings 812 812.000000 NaN
Трансформации
Преобразование группы или столбца возвращает индексированный объект того же размера, что и группируемый. Таким образом, преобразование должно возвращать результат того же размера, что и у группового фрагмента.
# import the pandas library
import pandas as pd
import numpy as np
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
grouped = df.groupby('Team')
score = lambda x: (x - x.mean()) / x.std()*10
print grouped.transform(score)
это output выглядит следующим образом -
Points Rank Year
0 12.843272 -15.000000 -11.618950
1 3.020286 5.000000 -3.872983
2 7.071068 -7.071068 -7.071068
3 -7.071068 7.071068 7.071068
4 -8.608621 11.547005 -10.910895
5 NaN NaN NaN
6 -2.360428 -5.773503 2.182179
7 10.969049 -5.773503 8.728716
8 -7.705963 5.000000 3.872983
9 -7.071068 7.071068 -7.071068
10 7.071068 -7.071068 7.071068
11 -8.157595 5.000000 11.618950
Фильтрация
Фильтрация фильтрует данные по определенным критериям и возвращает подмножество данных. Вfilter() функция используется для фильтрации данных.
import pandas as pd
import numpy as np
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
print df.groupby('Team').filter(lambda x: len(x) >= 3)
это output выглядит следующим образом -
Points Rank Team Year
0 876 1 Riders 2014
1 789 2 Riders 2015
4 741 3 Kings 2014
6 756 1 Kings 2016
7 788 1 Kings 2017
8 694 2 Riders 2016
11 690 2 Riders 2017
В приведенном выше условии фильтра мы просим вернуть команды, которые участвовали в IPL три или более раз.
Pandas имеет полнофункциональные, высокопроизводительные операции соединения в памяти, идиоматически очень похожие на реляционные базы данных, такие как SQL.
Pandas предоставляет единственную функцию, merge, в качестве точки входа для всех стандартных операций соединения базы данных между объектами DataFrame -
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True)
Здесь мы использовали следующие параметры -
left - Объект DataFrame.
right - Другой объект DataFrame.
on- Столбцы (имена) для присоединения. Должен находиться как в левом, так и в правом объекте DataFrame.
left_on- Столбцы из левого DataFrame для использования в качестве ключей. Могут быть имена столбцов или массивы с длиной, равной длине DataFrame.
right_on- Столбцы из правого DataFrame для использования в качестве ключей. Могут быть имена столбцов или массивы с длиной, равной длине DataFrame.
left_index - Если True,используйте индекс (метки строк) из левого DataFrame в качестве ключа (ключей) соединения. В случае DataFrame с MultiIndex (иерархическим) количество уровней должно соответствовать количеству ключей соединения из правого DataFrame.
right_index - То же использование, что и left_index для правильного DataFrame.
how- Один из «левый», «правый», «внешний», «внутренний». По умолчанию внутренний. Каждый метод описан ниже.
sort- Отсортируйте результат DataFrame по ключам соединения в лексикографическом порядке. По умолчанию установлено значение True, значение False во многих случаях существенно улучшает производительность.
Давайте теперь создадим два разных DataFrames и выполним с ними операции слияния.
# import the pandas library
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame(
{'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print left
print right
это output выглядит следующим образом -
Name id subject_id
0 Alex 1 sub1
1 Amy 2 sub2
2 Allen 3 sub4
3 Alice 4 sub6
4 Ayoung 5 sub5
Name id subject_id
0 Billy 1 sub2
1 Brian 2 sub4
2 Bran 3 sub3
3 Bryce 4 sub6
4 Betty 5 sub5
Слияние двух фреймов данных на ключе
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on='id')
это output выглядит следующим образом -
Name_x id subject_id_x Name_y subject_id_y
0 Alex 1 sub1 Billy sub2
1 Amy 2 sub2 Brian sub4
2 Allen 3 sub4 Bran sub3
3 Alice 4 sub6 Bryce sub6
4 Ayoung 5 sub5 Betty sub5
Слияние двух фреймов данных на нескольких ключах
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on=['id','subject_id'])
это output выглядит следующим образом -
Name_x id subject_id Name_y
0 Alice 4 sub6 Bryce
1 Ayoung 5 sub5 Betty
Слияние с использованием аргумента "как"
В howаргумент для слияния указывает, как определить, какие ключи должны быть включены в результирующую таблицу. Если комбинация клавиш не отображается ни в левой, ни в правой таблицах, значения в объединенной таблице будут Н / Д.
Вот краткое изложение how параметры и их эквивалентные имена в SQL -
Метод слияния | Эквивалент SQL | Описание |
---|---|---|
слева | ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ | Используйте ключи от левого объекта |
правильно | ПРАВО НАРУЖНОЕ СОЕДИНЕНИЕ | Используйте ключи от правого объекта |
внешний | ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ | Используйте объединение ключей |
внутренний | ВНУТРЕННЕЕ СОЕДИНЕНИЕ | Используйте пересечение ключей |
Левое соединение
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='left')
это output выглядит следующим образом -
Name_x id_x subject_id Name_y id_y
0 Alex 1 sub1 NaN NaN
1 Amy 2 sub2 Billy 1.0
2 Allen 3 sub4 Brian 2.0
3 Alice 4 sub6 Bryce 4.0
4 Ayoung 5 sub5 Betty 5.0
Правое соединение
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='right')
это output выглядит следующим образом -
Name_x id_x subject_id Name_y id_y
0 Amy 2.0 sub2 Billy 1
1 Allen 3.0 sub4 Brian 2
2 Alice 4.0 sub6 Bryce 4
3 Ayoung 5.0 sub5 Betty 5
4 NaN NaN sub3 Bran 3
Внешнее соединение
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, how='outer', on='subject_id')
это output выглядит следующим образом -
Name_x id_x subject_id Name_y id_y
0 Alex 1.0 sub1 NaN NaN
1 Amy 2.0 sub2 Billy 1.0
2 Allen 3.0 sub4 Brian 2.0
3 Alice 4.0 sub6 Bryce 4.0
4 Ayoung 5.0 sub5 Betty 5.0
5 NaN NaN sub3 Bran 3.0
Внутреннее соединение
Присоединение будет производиться по индексу. Операция соединения учитывает объект, для которого она вызывается. Так,a.join(b) не равно b.join(a).
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='inner')
это output выглядит следующим образом -
Name_x id_x subject_id Name_y id_y
0 Amy 2 sub2 Billy 1
1 Allen 3 sub4 Brian 2
2 Alice 4 sub6 Bryce 4
3 Ayoung 5 sub5 Betty 5
Pandas предоставляет различные возможности для простого комбинирования Series, DataFrame, и Panel объекты.
pd.concat(objs,axis=0,join='outer',join_axes=None,
ignore_index=False)
objs - Это последовательность или отображение объектов Series, DataFrame или Panel.
axis - {0, 1, ...}, по умолчанию 0. Это ось для объединения.
join- {'внутренний', 'внешний'}, по умолчанию 'внешний'. Как обрабатывать индексы на других осях. Внешний для соединения и внутренний для пересечения.
ignore_index- логическое значение, по умолчанию False. Если True, не используйте значения индекса на оси конкатенации. Результирующая ось будет помечена 0, ..., n - 1.
join_axes- Это список объектов индекса. Конкретные индексы для использования для других (n-1) осей вместо выполнения логики внутреннего / внешнего набора.
Объединение объектов
В concatФункция выполняет всю тяжелую работу по выполнению операций конкатенации вдоль оси. Давайте создадим разные объекты и сделаем конкатенацию.
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
print pd.concat([one,two])
это output выглядит следующим образом -
Marks_scored Name subject_id
1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
Предположим, мы хотим связать определенные ключи с каждой частью разделенного DataFrame. Мы можем сделать это, используяkeys аргумент -
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
print pd.concat([one,two],keys=['x','y'])
это output выглядит следующим образом -
x 1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
y 1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
Индекс результирующего дублируется; каждый указатель повторяется.
Если результирующий объект должен следовать своей собственной индексации, установите ignore_index к True.
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
print pd.concat([one,two],keys=['x','y'],ignore_index=True)
это output выглядит следующим образом -
Marks_scored Name subject_id
0 98 Alex sub1
1 90 Amy sub2
2 87 Allen sub4
3 69 Alice sub6
4 78 Ayoung sub5
5 89 Billy sub2
6 80 Brian sub4
7 79 Bran sub3
8 97 Bryce sub6
9 88 Betty sub5
Обратите внимание, индекс полностью изменяется, и ключи также переопределяются.
Если нужно добавить два объекта axis=1, затем будут добавлены новые столбцы.
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
print pd.concat([one,two],axis=1)
это output выглядит следующим образом -
Marks_scored Name subject_id Marks_scored Name subject_id
1 98 Alex sub1 89 Billy sub2
2 90 Amy sub2 80 Brian sub4
3 87 Allen sub4 79 Bran sub3
4 69 Alice sub6 97 Bryce sub6
5 78 Ayoung sub5 88 Betty sub5
Объединение с использованием добавления
Полезным ярлыком для concat являются методы добавления экземпляра в Series и DataFrame. Эти методы фактически предшествовали concat. Они соединяются вместеaxis=0, а именно индекс -
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
print one.append(two)
это output выглядит следующим образом -
Marks_scored Name subject_id
1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
В append функция также может принимать несколько объектов -
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
print one.append([two,one,two])
это output выглядит следующим образом -
Marks_scored Name subject_id
1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
Временные ряды
Pandas предоставляет надежный инструмент для работы с данными временных рядов, особенно в финансовом секторе. При работе с данными временных рядов мы часто сталкиваемся со следующим:
- Генерация последовательности времени
- Преобразование временных рядов в разные частоты
Pandas предоставляет относительно компактный и автономный набор инструментов для выполнения вышеуказанных задач.
Получить текущее время
datetime.now() дает вам текущую дату и время.
import pandas as pd
print pd.datetime.now()
это output выглядит следующим образом -
2017-05-11 06:10:13.393147
Создать отметку времени
Данные с отметкой времени - это самый основной тип данных временного ряда, который связывает значения с моментами времени. Для объектов pandas это означает использование точек во времени. Возьмем пример -
import pandas as pd
print pd.Timestamp('2017-03-01')
это output выглядит следующим образом -
2017-03-01 00:00:00
Также возможно преобразовать целое или плавающее время эпох. Единицей измерения по умолчанию являются наносекунды (поскольку именно так хранятся метки времени). Однако часто эпохи сохраняются в другом модуле, который можно указать. Возьмем другой пример
import pandas as pd
print pd.Timestamp(1587687255,unit='s')
это output выглядит следующим образом -
2020-04-24 00:14:15
Создайте диапазон времени
import pandas as pd
print pd.date_range("11:00", "13:30", freq="30min").time
это output выглядит следующим образом -
[datetime.time(11, 0) datetime.time(11, 30) datetime.time(12, 0)
datetime.time(12, 30) datetime.time(13, 0) datetime.time(13, 30)]
Измените частоту времени
import pandas as pd
print pd.date_range("11:00", "13:30", freq="H").time
это output выглядит следующим образом -
[datetime.time(11, 0) datetime.time(12, 0) datetime.time(13, 0)]
Преобразование в метки времени
Чтобы преобразовать объект типа Series или списка из объектов типа даты, например строк, эпох или их смеси, вы можете использовать to_datetimeфункция. При передаче возвращается серия (с тем же индексом), аlist-like преобразуется в DatetimeIndex. Взгляните на следующий пример -
import pandas as pd
print pd.to_datetime(pd.Series(['Jul 31, 2009','2010-01-10', None]))
это output выглядит следующим образом -
0 2009-07-31
1 2010-01-10
2 NaT
dtype: datetime64[ns]
NaT средства Not a Time (эквивалент NaN)
Возьмем другой пример.
import pandas as pd
print pd.to_datetime(['2005/11/23', '2010.12.31', None])
это output выглядит следующим образом -
DatetimeIndex(['2005-11-23', '2010-12-31', 'NaT'], dtype='datetime64[ns]', freq=None)
Расширяя временной ряд, функции даты играют важную роль в анализе финансовых данных. При работе с данными Date мы часто сталкиваемся со следующим:
- Генерация последовательности дат
- Преобразуйте ряд дат в разные частоты
Создайте диапазон дат
Используя date.range()функцию, указав периоды и частоту, мы можем создать ряд дат. По умолчанию частота диапазона - Дни.
import pandas as pd
print pd.date_range('1/1/2011', periods=5)
это output выглядит следующим образом -
DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'],
dtype='datetime64[ns]', freq='D')
Изменить частоту даты
import pandas as pd
print pd.date_range('1/1/2011', periods=5,freq='M')
это output выглядит следующим образом -
DatetimeIndex(['2011-01-31', '2011-02-28', '2011-03-31', '2011-04-30', '2011-05-31'],
dtype='datetime64[ns]', freq='M')
bdate_range
bdate_range () обозначает диапазоны рабочих дат. В отличие от date_range (), он исключает субботу и воскресенье.
import pandas as pd
print pd.date_range('1/1/2011', periods=5)
это output выглядит следующим образом -
DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'],
dtype='datetime64[ns]', freq='D')
Обратите внимание, что после 3 марта дата переходит на 6 марта, за исключением 4 и 5. Просто проверьте свой календарь на дни.
Функции удобства вроде date_range и bdate_rangeиспользовать различные частотные псевдонимы. Частота по умолчанию для date_range - календарный день, а для bdate_range по умолчанию - рабочий день.
import pandas as pd
start = pd.datetime(2011, 1, 1)
end = pd.datetime(2011, 1, 5)
print pd.date_range(start, end)
это output выглядит следующим образом -
DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'],
dtype='datetime64[ns]', freq='D')
Смещение псевдонимов
Для полезных общих частот временных рядов дается ряд псевдонимов строк. Мы будем называть эти псевдонимы псевдонимами смещения.
Псевдоним | Описание | Псевдоним | Описание |
---|---|---|---|
B | частота рабочих дней | BQS | частота начала бизнес-квартала |
D | частота календарных дней | А | годовая (год) конечная частота |
W | еженедельная частота | BA | частота окончания финансового года |
M | частота окончания месяца | BAS | частота начала финансового года |
SM | частота окончания полумесяца | BH | частота рабочих часов |
BM | частота окончания рабочего месяца | ЧАС | почасовая частота |
РС | частота начала месяца | Т, мин | поминутная частота |
SMS | Частота начала полумесяца SMS | S | во-вторых частота |
BMS | частота начала рабочего месяца | L, мс | миллисекунды |
Q | частота конца четверти | U, нас | микросекунды |
BQ | частота окончания финансового квартала | N | наносекунды |
QS | частота начала четверти |
Временные дельты - это разница во времени, выраженная в единицах разницы, например, дни, часы, минуты, секунды. Они могут быть как положительными, так и отрицательными.
Мы можем создавать объекты Timedelta, используя различные аргументы, как показано ниже -
Строка
Передав строковый литерал, мы можем создать объект timedelta.
import pandas as pd
print pd.Timedelta('2 days 2 hours 15 minutes 30 seconds')
это output выглядит следующим образом -
2 days 02:15:30
Целое число
Передавая целочисленное значение с единицей измерения, аргумент создает объект Timedelta.
import pandas as pd
print pd.Timedelta(6,unit='h')
это output выглядит следующим образом -
0 days 06:00:00
Смещения данных
Смещения данных, такие как недели, дни, часы, минуты, секунды, миллисекунды, микросекунды, наносекунды, также могут использоваться в строительстве.
import pandas as pd
print pd.Timedelta(days=2)
это output выглядит следующим образом -
2 days 00:00:00
to_timedelta ()
Использование верхнего уровня pd.to_timedelta, вы можете преобразовать скаляр, массив, список или ряд из распознанного формата / значения timedelta в тип Timedelta. Он построит Series, если вход является Series, скаляр, если вход подобен скаляру, иначе будет выводитьTimedeltaIndex.
import pandas as pd
print pd.Timedelta(days=2)
это output выглядит следующим образом -
2 days 00:00:00
Операции
Вы можете работать с Series / DataFrames и создавать timedelta64[ns] Последовательность операций вычитания на datetime64[ns] Серии или отметки времени.
Давайте теперь создадим DataFrame с объектами Timedelta и datetime и выполним с ним некоторые арифметические операции -
import pandas as pd
s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D'))
td = pd.Series([ pd.Timedelta(days=i) for i in range(3) ])
df = pd.DataFrame(dict(A = s, B = td))
print df
это output выглядит следующим образом -
A B
0 2012-01-01 0 days
1 2012-01-02 1 days
2 2012-01-03 2 days
Дополнительные операции
import pandas as pd
s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D'))
td = pd.Series([ pd.Timedelta(days=i) for i in range(3) ])
df = pd.DataFrame(dict(A = s, B = td))
df['C']=df['A']+df['B']
print df
это output выглядит следующим образом -
A B C
0 2012-01-01 0 days 2012-01-01
1 2012-01-02 1 days 2012-01-03
2 2012-01-03 2 days 2012-01-05
Операция вычитания
import pandas as pd
s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D'))
td = pd.Series([ pd.Timedelta(days=i) for i in range(3) ])
df = pd.DataFrame(dict(A = s, B = td))
df['C']=df['A']+df['B']
df['D']=df['C']+df['B']
print df
это output выглядит следующим образом -
A B C D
0 2012-01-01 0 days 2012-01-01 2012-01-01
1 2012-01-02 1 days 2012-01-03 2012-01-04
2 2012-01-03 2 days 2012-01-05 2012-01-07
Часто в режиме реального времени данные включают повторяющиеся текстовые столбцы. Такие функции, как пол, страна и коды, всегда повторяются. Это примеры категориальных данных.
Категориальные переменные могут принимать только ограниченное и обычно фиксированное количество возможных значений. Помимо фиксированной длины, категориальные данные могут иметь порядок, но не могут выполнять числовые операции. Категориальные - это тип данных Pandas.
Категориальный тип данных полезен в следующих случаях:
Строковая переменная, состоящая всего из нескольких разных значений. Преобразование такой строковой переменной в категориальную позволяет сэкономить память.
Лексический порядок переменной отличается от логического порядка («один», «два», «три»). При преобразовании в категориальный и указании порядка в категориях, сортировка и мин. / Макс. Будут использовать логический порядок вместо лексического.
Как сигнал другим библиотекам Python о том, что этот столбец следует рассматривать как категориальную переменную (например, для использования подходящих статистических методов или типов графиков).
Создание объекта
Категориальный объект можно создать несколькими способами. Различные способы были описаны ниже -
категория
Указав dtype как «категорию» при создании объекта pandas.
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
print s
это output выглядит следующим образом -
0 a
1 b
2 c
3 a
dtype: category
Categories (3, object): [a, b, c]
Количество элементов, переданных объекту серии, равно четырем, но категорий всего три. То же самое и с выходными категориями.
pd.Categorical
Используя стандартный конструктор категорий pandas, мы можем создать объект категории.
pandas.Categorical(values, categories, ordered)
Возьмем пример -
import pandas as pd
cat = pd.Categorical(['a', 'b', 'c', 'a', 'b', 'c'])
print cat
это output выглядит следующим образом -
[a, b, c, a, b, c]
Categories (3, object): [a, b, c]
Приведем еще один пример -
import pandas as pd
cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'])
print cat
это output выглядит следующим образом -
[a, b, c, a, b, c, NaN]
Categories (3, object): [c, b, a]
Здесь второй аргумент обозначает категории. Таким образом, любое значение, не представленное в категориях, будет рассматриваться какNaN.
Теперь взгляните на следующий пример -
import pandas as pd
cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'],ordered=True)
print cat
это output выглядит следующим образом -
[a, b, c, a, b, c, NaN]
Categories (3, object): [c < b < a]
Логически порядок означает, что, a больше, чем b и b больше, чем c.
Описание
Используя .describe() для категориальных данных, мы получаем аналогичный результат Series или же DataFrame из type строка.
import pandas as pd
import numpy as np
cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
df = pd.DataFrame({"cat":cat, "s":["a", "c", "c", np.nan]})
print df.describe()
print df["cat"].describe()
это output выглядит следующим образом -
cat s
count 3 3
unique 2 2
top c c
freq 2 2
count 3
unique 2
top c
freq 2
Name: cat, dtype: object
Получить свойства категории
obj.cat.categories команда используется для получения categories of the object.
import pandas as pd
import numpy as np
s = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print s.categories
это output выглядит следующим образом -
Index([u'b', u'a', u'c'], dtype='object')
obj.ordered команда используется для получения порядка объекта.
import pandas as pd
import numpy as np
cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print cat.ordered
это output выглядит следующим образом -
False
Функция вернула false потому что мы не указали заказ.
Переименование категорий
Переименование категорий осуществляется путем присвоения новых значений параметрам series.cat.categoriesseries.cat.categories свойство.
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
s.cat.categories = ["Group %s" % g for g in s.cat.categories]
print s.cat.categories
это output выглядит следующим образом -
Index([u'Group a', u'Group b', u'Group c'], dtype='object')
Начальные категории [a,b,c] обновляются s.cat.categories свойство объекта.
Добавление новых категорий
С помощью метода Categories.add.categories () можно добавлять новые категории.
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
s = s.cat.add_categories([4])
print s.cat.categories
это output выглядит следующим образом -
Index([u'a', u'b', u'c', 4], dtype='object')
Удаление категорий
Используя Categorical.remove_categories() метод, нежелательные категории могут быть удалены.
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
print ("Original object:")
print s
print ("After removal:")
print s.cat.remove_categories("a")
это output выглядит следующим образом -
Original object:
0 a
1 b
2 c
3 a
dtype: category
Categories (3, object): [a, b, c]
After removal:
0 NaN
1 b
2 c
3 NaN
dtype: category
Categories (2, object): [b, c]
Сравнение категориальных данных
Сравнение категориальных данных с другими объектами возможно в трех случаях:
сравнение равенства (== и! =) со списковым объектом (список, серия, массив, ...) той же длины, что и категориальные данные.
все сравнения (==,! =,>,> =, <и <=) категориальных данных с другой категориальной серией, если они упорядочены == True и категории совпадают.
все сравнения категориальных данных со скаляром.
Взгляните на следующий пример -
import pandas as pd
cat = pd.Series([1,2,3]).astype("category", categories=[1,2,3], ordered=True)
cat1 = pd.Series([2,2,2]).astype("category", categories=[1,2,3], ordered=True)
print cat>cat1
это output выглядит следующим образом -
0 False
1 False
2 True
dtype: bool
Основной сюжет: сюжет
Эта функция в Series и DataFrame представляет собой простую оболочку для matplotlib libraries plot() метод.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10,4),index=pd.date_range('1/1/2000',
periods=10), columns=list('ABCD'))
df.plot()
это output выглядит следующим образом -
Если индекс состоит из дат, он вызывает gct().autofmt_xdate() , чтобы отформатировать ось x, как показано на иллюстрации выше.
Мы можем построить график зависимости одного столбца от другого, используя x и y ключевые слова.
Методы печати позволяют использовать несколько стилей печати, кроме линейного графика по умолчанию. Эти методы могут быть предоставлены как аргумент ключевого слова kind дляplot(). К ним относятся -
- бар или бар для участков
- hist для гистограммы
- ящик для ящичного участка
- 'area' для участков
- 'scatter' для диаграмм рассеяния
Барный участок
Давайте теперь посмотрим, что такое гистограмма, создав ее. Барную диаграмму можно создать следующим образом -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d')
df.plot.bar()
это output выглядит следующим образом -
Чтобы создать диаграмму столбцов с накоплением, pass stacked=True -
import pandas as pd
df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d')
df.plot.bar(stacked=True)
это output выглядит следующим образом -
Чтобы получить графики горизонтальной полосы, используйте barh метод -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d')
df.plot.barh(stacked=True)
это output выглядит следующим образом -
Гистограммы
Гистограммы можно построить с помощью plot.hist()метод. Мы можем указать количество ящиков.
import pandas as pd
import numpy as np
df = pd.DataFrame({'a':np.random.randn(1000)+1,'b':np.random.randn(1000),'c':
np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])
df.plot.hist(bins=20)
это output выглядит следующим образом -
Чтобы построить разные гистограммы для каждого столбца, используйте следующий код -
import pandas as pd
import numpy as np
df=pd.DataFrame({'a':np.random.randn(1000)+1,'b':np.random.randn(1000),'c':
np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])
df.diff.hist(bins=20)
это output выглядит следующим образом -
Коробчатые графики
Коробчатый график можно нарисовать, позвонив Series.box.plot() и DataFrame.box.plot(), или же DataFrame.boxplot() для визуализации распределения значений в каждом столбце.
Например, вот диаграмма, представляющая пять испытаний из 10 наблюдений однородной случайной величины на [0,1).
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
df.plot.box()
это output выглядит следующим образом -
Площадь участка
График площади можно создать с помощью Series.plot.area() или DataFrame.plot.area() методы.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df.plot.area()
это output выглядит следующим образом -
Точечная диаграмма
График рассеяния можно создать с помощью DataFrame.plot.scatter() методы.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])
df.plot.scatter(x='a', y='b')
это output выглядит следующим образом -
Круговая диаграмма
Круговую диаграмму можно создать с помощью DataFrame.plot.pie() метод.
import pandas as pd
import numpy as np
df = pd.DataFrame(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], columns=['x'])
df.plot.pie(subplots=True)
это output выглядит следующим образом -
В Pandas I/O API это набор функций чтения верхнего уровня, доступ к которым осуществляется как pd.read_csv() которые обычно возвращают объект Pandas.
Две основные функции для чтения текстовых файлов (или плоских файлов): read_csv() и read_table(). Оба они используют один и тот же код синтаксического анализа для интеллектуального преобразования табличных данных вDataFrame объект -
pandas.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer',
names=None, index_col=None, usecols=None
pandas.read_csv(filepath_or_buffer, sep='\t', delimiter=None, header='infer',
names=None, index_col=None, usecols=None
Вот как csv данные файла выглядят так -
S.No,Name,Age,City,Salary
1,Tom,28,Toronto,20000
2,Lee,32,HongKong,3000
3,Steven,43,Bay Area,8300
4,Ram,38,Hyderabad,3900
Сохраните эти данные как temp.csv и проводить на нем операции.
S.No,Name,Age,City,Salary
1,Tom,28,Toronto,20000
2,Lee,32,HongKong,3000
3,Steven,43,Bay Area,8300
4,Ram,38,Hyderabad,3900
Сохраните эти данные как temp.csv и проводить на нем операции.
read.csv
read.csv читает данные из файлов csv и создает объект DataFrame.
import pandas as pd
df=pd.read_csv("temp.csv")
print df
это output выглядит следующим образом -
S.No Name Age City Salary
0 1 Tom 28 Toronto 20000
1 2 Lee 32 HongKong 3000
2 3 Steven 43 Bay Area 8300
3 4 Ram 38 Hyderabad 3900
специальный индекс
Это указывает столбец в файле csv для настройки индекса с помощью index_col.
import pandas as pd
df=pd.read_csv("temp.csv",index_col=['S.No'])
print df
это output выглядит следующим образом -
S.No Name Age City Salary
1 Tom 28 Toronto 20000
2 Lee 32 HongKong 3000
3 Steven 43 Bay Area 8300
4 Ram 38 Hyderabad 3900
Конвертеры
dtype столбцов можно передать как dict.
import pandas as pd
df = pd.read_csv("temp.csv", dtype={'Salary': np.float64})
print df.dtypes
это output выглядит следующим образом -
S.No int64
Name object
Age int64
City object
Salary float64
dtype: object
По умолчанию dtype столбца "Зарплата" int, но результат показывает это как float потому что мы явно привели тип.
Таким образом, данные выглядят как float -
S.No Name Age City Salary
0 1 Tom 28 Toronto 20000.0
1 2 Lee 32 HongKong 3000.0
2 3 Steven 43 Bay Area 8300.0
3 4 Ram 38 Hyderabad 3900.0
header_names
Укажите имена заголовка, используя аргумент names.
import pandas as pd
df=pd.read_csv("temp.csv", names=['a', 'b', 'c','d','e'])
print df
это output выглядит следующим образом -
a b c d e
0 S.No Name Age City Salary
1 1 Tom 28 Toronto 20000
2 2 Lee 32 HongKong 3000
3 3 Steven 43 Bay Area 8300
4 4 Ram 38 Hyderabad 3900
Обратите внимание, к именам заголовков добавляются пользовательские имена, но заголовок в файле не был удален. Теперь мы используем аргумент заголовка, чтобы удалить это.
Если заголовок находится в строке, отличной от первой, передайте номер строки в заголовок. Это пропустит предыдущие строки.
import pandas as pd
df=pd.read_csv("temp.csv",names=['a','b','c','d','e'],header=0)
print df
это output выглядит следующим образом -
a b c d e
0 S.No Name Age City Salary
1 1 Tom 28 Toronto 20000
2 2 Lee 32 HongKong 3000
3 3 Steven 43 Bay Area 8300
4 4 Ram 38 Hyderabad 3900
скипроу
skiprows пропускает указанное количество строк.
import pandas as pd
df=pd.read_csv("temp.csv", skiprows=2)
print df
это output выглядит следующим образом -
2 Lee 32 HongKong 3000
0 3 Steven 43 Bay Area 8300
1 4 Ram 38 Hyderabad 3900
Разреженные объекты «сжимаются», когда любые данные, соответствующие определенному значению (NaN / отсутствующее значение, хотя можно выбрать любое значение), опущены. Специальный объект SparseIndex отслеживает, где данные были «разрежены». Это будет иметь больше смысла в примере. Все стандартные структуры данных Pandas применяютto_sparse метод -
import pandas as pd
import numpy as np
ts = pd.Series(np.random.randn(10))
ts[2:-2] = np.nan
sts = ts.to_sparse()
print sts
это output выглядит следующим образом -
0 -0.810497
1 -1.419954
2 NaN
3 NaN
4 NaN
5 NaN
6 NaN
7 NaN
8 0.439240
9 -1.095910
dtype: float64
BlockIndex
Block locations: array([0, 8], dtype=int32)
Block lengths: array([2, 2], dtype=int32)
Редкие объекты существуют по причинам эффективности памяти.
Давайте теперь предположим, что у вас есть большой фрейм данных NA, и выполните следующий код -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10000, 4))
df.ix[:9998] = np.nan
sdf = df.to_sparse()
print sdf.density
это output выглядит следующим образом -
0.0001
Любой разреженный объект можно преобразовать обратно в стандартную плотную форму, вызвав to_dense -
import pandas as pd
import numpy as np
ts = pd.Series(np.random.randn(10))
ts[2:-2] = np.nan
sts = ts.to_sparse()
print sts.to_dense()
это output выглядит следующим образом -
0 -0.810497
1 -1.419954
2 NaN
3 NaN
4 NaN
5 NaN
6 NaN
7 NaN
8 0.439240
9 -1.095910
dtype: float64
Редкие типы Dtypes
Разреженные данные должны иметь тот же dtype, что и их плотное представление. В настоящее время,float64, int64 и booldtypesподдерживаются. В зависимости от оригиналаdtype, fill_value default изменения -
float64 - нп.нан
int64 - 0
bool - ложь
Давайте выполним следующий код, чтобы понять то же самое -
import pandas as pd
import numpy as np
s = pd.Series([1, np.nan, np.nan])
print s
s.to_sparse()
print s
это output выглядит следующим образом -
0 1.0
1 NaN
2 NaN
dtype: float64
0 1.0
1 NaN
2 NaN
dtype: float64
Caveats означает предупреждение, а gotcha означает невидимую проблему.
Использование оператора If / Truth с пандами
Pandas следует соглашению numpy о выдаче ошибки при попытке преобразовать что-либо в bool. Это происходит вif или же when используя логические операции, и or, или же not. Непонятно, каким должен быть результат. Должно ли это быть Истина, потому что это не нулевая длина? Ложь, потому что есть Ложные значения? Это неясно, поэтому вместо этого Pandas поднимаетValueError -
import pandas as pd
if pd.Series([False, True, False]):
print 'I am True'
это output выглядит следующим образом -
ValueError: The truth value of a Series is ambiguous.
Use a.empty, a.bool() a.item(),a.any() or a.all().
В ifсостояние, непонятно что с ним делать. Ошибка указывает на то, следует ли использоватьNone или же any of those.
import pandas as pd
if pd.Series([False, True, False]).any():
print("I am any")
это output выглядит следующим образом -
I am any
Чтобы оценить одноэлементные объекты pandas в логическом контексте, используйте метод .bool() -
import pandas as pd
print pd.Series([True]).bool()
это output выглядит следующим образом -
True
Побитовое логическое значение
Побитовые логические операторы, такие как == и != вернет логический ряд, который в любом случае почти всегда требуется.
import pandas as pd
s = pd.Series(range(5))
print s==4
это output выглядит следующим образом -
0 False
1 False
2 False
3 False
4 True
dtype: bool
isin Operation
Это возвращает логическую серию, показывающую, содержится ли каждый элемент в серии точно в переданной последовательности значений.
import pandas as pd
s = pd.Series(list('abc'))
s = s.isin(['a', 'c', 'e'])
print s
это output выглядит следующим образом -
0 True
1 False
2 True
dtype: bool
Переиндексирование против ix Gotcha
Многие пользователи обнаружат, что используют ix indexing capabilities как краткое средство выбора данных из объекта Pandas -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))
print df
print df.ix[['b', 'c', 'e']]
это output выглядит следующим образом -
one two three four
a -1.582025 1.335773 0.961417 -1.272084
b 1.461512 0.111372 -0.072225 0.553058
c -1.240671 0.762185 1.511936 -0.630920
d -2.380648 -0.029981 0.196489 0.531714
e 1.846746 0.148149 0.275398 -0.244559
f -1.842662 -0.933195 2.303949 0.677641
one two three four
b 1.461512 0.111372 -0.072225 0.553058
c -1.240671 0.762185 1.511936 -0.630920
e 1.846746 0.148149 0.275398 -0.244559
В данном случае это, конечно, полностью эквивалентно использованию reindex метод -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))
print df
print df.reindex(['b', 'c', 'e'])
это output выглядит следующим образом -
one two three four
a 1.639081 1.369838 0.261287 -1.662003
b -0.173359 0.242447 -0.494384 0.346882
c -0.106411 0.623568 0.282401 -0.916361
d -1.078791 -0.612607 -0.897289 -1.146893
e 0.465215 1.552873 -1.841959 0.329404
f 0.966022 -0.190077 1.324247 0.678064
one two three four
b -0.173359 0.242447 -0.494384 0.346882
c -0.106411 0.623568 0.282401 -0.916361
e 0.465215 1.552873 -1.841959 0.329404
Некоторые могут сделать вывод, что ix и reindexна 100% эквивалентны. Это верно, кроме случая целочисленной индексации. Например, указанная выше операция может быть выражена как -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))
print df
print df.ix[[1, 2, 4]]
print df.reindex([1, 2, 4])
это output выглядит следующим образом -
one two three four
a -1.015695 -0.553847 1.106235 -0.784460
b -0.527398 -0.518198 -0.710546 -0.512036
c -0.842803 -1.050374 0.787146 0.205147
d -1.238016 -0.749554 -0.547470 -0.029045
e -0.056788 1.063999 -0.767220 0.212476
f 1.139714 0.036159 0.201912 0.710119
one two three four
b -0.527398 -0.518198 -0.710546 -0.512036
c -0.842803 -1.050374 0.787146 0.205147
e -0.056788 1.063999 -0.767220 0.212476
one two three four
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
4 NaN NaN NaN NaN
Важно помнить, что reindex is strict label indexing only. Это может привести к некоторым потенциально неожиданным результатам в патологических случаях, когда индекс содержит, скажем, как целые числа, так и строки.
Поскольку многие потенциальные пользователи Pandas в некоторой степени знакомы с SQL, эта страница предназначена для предоставления некоторых примеров того, как различные операции SQL могут выполняться с использованием pandas.
import pandas as pd
url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'
tips=pd.read_csv(url)
print tips.head()
это output выглядит следующим образом -
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
ВЫБРАТЬ
В SQL выбор выполняется с использованием списка столбцов, разделенных запятыми, которые вы выбираете (или * для выбора всех столбцов) -
SELECT total_bill, tip, smoker, time
FROM tips
LIMIT 5;
В Pandas выбор столбца выполняется путем передачи списка имен столбцов в ваш DataFrame -
tips[['total_bill', 'tip', 'smoker', 'time']].head(5)
Проверим полную программу -
import pandas as pd
url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'
tips=pd.read_csv(url)
print tips[['total_bill', 'tip', 'smoker', 'time']].head(5)
это output выглядит следующим образом -
total_bill tip smoker time
0 16.99 1.01 No Dinner
1 10.34 1.66 No Dinner
2 21.01 3.50 No Dinner
3 23.68 3.31 No Dinner
4 24.59 3.61 No Dinner
Вызов DataFrame без списка имен столбцов отобразит все столбцы (аналогично SQL *).
ГДЕ
Фильтрация в SQL выполняется с помощью предложения WHERE.
SELECT * FROM tips WHERE time = 'Dinner' LIMIT 5;
DataFrames можно фильтровать несколькими способами; наиболее интуитивно понятным из них является использование логической индексации.
tips[tips['time'] == 'Dinner'].head(5)
Проверим полную программу -
import pandas as pd
url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'
tips=pd.read_csv(url)
print tips[tips['time'] == 'Dinner'].head(5)
это output выглядит следующим образом -
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
Приведенный выше оператор передает серию объектов True / False в DataFrame, возвращая все строки с True.
Группа по
Эта операция извлекает количество записей в каждой группе в наборе данных. Например, запрос, извлекающий количество советов, оставленных по полу -
SELECT sex, count(*)
FROM tips
GROUP BY sex;
Эквивалент Pandas будет -
tips.groupby('sex').size()
Проверим полную программу -
import pandas as pd
url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'
tips=pd.read_csv(url)
print tips.groupby('sex').size()
это output выглядит следующим образом -
sex
Female 87
Male 157
dtype: int64
Верхние N строк
SQL возвращает top n rows с помощью LIMIT -
SELECT * FROM tips
LIMIT 5 ;
Эквивалент Pandas будет -
tips.head(5)
Давайте проверим полный пример -
import pandas as pd
url = 'https://raw.github.com/pandas-dev/pandas/master/pandas/tests/data/tips.csv'
tips=pd.read_csv(url)
tips = tips[['smoker', 'day', 'time']].head(5)
print tips
это output выглядит следующим образом -
smoker day time
0 No Sun Dinner
1 No Sun Dinner
2 No Sun Dinner
3 No Sun Dinner
4 No Sun Dinner
Это несколько основных операций, которые мы сравнивали, и которые мы узнали в предыдущих главах библиотеки Pandas.