Вступление
Пакет Pythonpandas
используется для обработки и анализа данных, он разработан, чтобы позволить вам работать с помеченными или реляционными данными более интуитивно понятным способом.
Построенный на основе пакетаnumpy
,pandas
включает метки, описательные индексы и особенно надежен при обработке общих форматов данных и отсутствующих данных.
Пакетpandas
предлагает функции электронных таблиц, но работа с данными с Python выполняется намного быстрее, чем с электронными таблицами, аpandas
оказывается очень эффективным.
В этом руководстве мы сначала установимpandas
, а затем познакомим вас с основными структурами данных:Series иDataFrames.
Установкаpandas
Как и другие пакеты Python, мы можем установитьpandas
с помощьюpip
.
Во-первых, давайте перейдем к нашему выборуlocal programming environment илиserver-based programming environment и установим тамpandas
вместе с его зависимостями:
pip install pandas numpy python-dateutil pytz
Вы должны получить вывод, подобный следующему:
OutputSuccessfully installed pandas-0.19.2
Если вы предпочитаете устанавливатьpandas
вAnaconda, вы можете сделать это с помощью следующей команды:
conda install pandas
На этом этапе вы готовы начать работу с пакетомpandas
.
Серии
Вpandas
,Series - одномерные массивы, которые могут содержать любыеdata type. Метки осей вместе обозначаются какindex.
Давайте запустим интерпретатор Python в вашей командной строке следующим образом:
python
Из интерпретатора импортируйте пакетыnumpy
иpandas
в свое пространство имен:
import numpy as np
import pandas as pd
Прежде чем мы начнем работать с Series, давайте посмотрим, как это обычно выглядит:
s = pd.Series([data], index=[index])
Вы можете заметить, что данные структурированы как Pythonlist.
Без объявления индекса
Мы введем целочисленные данные, а затем предоставим параметр имени для серии, но мы не будем использовать параметрindex
, чтобы увидеть, какpandas
заполняет его неявно:
s = pd.Series([0, 1, 4, 9, 16, 25], name='Squares')
Теперь давайте назовем Series, чтобы увидеть, что с ним делаетpandas
:
s
Мы увидим следующий вывод с индексом в левом столбце, наши значения данных в правом столбце. Под столбцами приведена информация об имени серии и типе данных, составляющих значения.
Output0 0
1 1
2 4
3 9
4 16
5 25
Name: Squares, dtype: int64
Хотя мы не предоставили индекс для массива, он был добавлен неявно из целых значений от0
до5
.
Объявление индекса
Как показывает приведенный выше синтаксис, мы также можем создавать Series с явным индексом. Мы будем использовать данные о средней глубине в метрах океанов Земли:
avg_ocean_depth = pd.Series([1205, 3646, 3741, 4080, 3270], index=['Arctic', 'Atlantic', 'Indian', 'Pacific', 'Southern'])
Сконструировав Series, давайте назовем его, чтобы увидеть результат:
avg_ocean_depth
OutputArctic 1205
Atlantic 3646
Indian 3741
Pacific 4080
Southern 3270
dtype: int64
Мы можем видеть, что индекс, который мы предоставили, находится слева со значениями справа.
Индексирование и нарезка серии
С сериейpandas
мы можем индексировать по соответствующему номеру для получения значений:
avg_ocean_depth[2]
Output3741
Мы также можем нарезать по номеру индекса, чтобы получить значения:
avg_ocean_depth[2:4]
OutputIndian 3741
Pacific 4080
dtype: int64
Кроме того, мы можем вызвать значение индекса, чтобы вернуть значение, которому оно соответствует:
avg_ocean_depth['Indian']
Output3741
Мы также можем нарезать значения индекса, чтобы получить соответствующие значения:
avg_ocean_depth['Indian':'Southern']
OutputIndian 3741
Pacific 4080
Southern 3270
dtype: int64
Обратите внимание, что в этом последнем примере при разрезании по именам индексов два параметра являются включающими, а не исключающими.
Давайте выйдем из интерпретатора Python с помощьюquit()
.
Серия инициализирована со словарями
Сpandas
мы также можем использовать тип данныхdictionary для инициализации Series. Таким образом, мы не будем объявлять индекс как отдельный список, а вместо этого будем использовать встроенные ключи в качестве индекса.
Давайте создадим файл с именемocean.py
и добавим следующий словарь с вызовом для его печати.
ocean.py
import numpy as np
import pandas as pd
avg_ocean_depth = pd.Series({
'Arctic': 1205,
'Atlantic': 3646,
'Indian': 3741,
'Pacific': 4080,
'Southern': 3270
})
print(avg_ocean_depth)
Теперь мы можем запустить файл в командной строке:
python ocean.py
Мы получим следующий вывод:
OutputArctic 1205
Atlantic 3646
Indian 3741
Pacific 4080
Southern 3270
dtype: int64
Ряд отображается упорядоченно, с индексом (составленным из наших ключей) слева и набором значений справа.
Это будет вести себя как другие словари Python, так как вы можете получить доступ к значениям, вызвав ключ, что мы можем сделать так:
ocean_depth.py
...
print(avg_ocean_depth['Indian'])
print(avg_ocean_depth['Atlantic':'Indian'])
Output3741
Atlantic 3646
Indian 3741
dtype: int64
Однако эти Серии теперь являются объектами Python, поэтому вы не сможете использовать функции словаря.
Словари Python предоставляют другую форму для установки Series вpandas
.
DataFrames
DataFrames - это двумерные помеченные структуры данных, в которых есть столбцы, которые могут состоять из данных разных типов.
Фреймы данных похожи на электронные таблицы или таблицы SQL. В общем, когда вы работаете сpandas
, DataFrames будут наиболее распространенным объектом, который вы будете использовать.
Чтобы понять, как работает DataFramepandas
, давайте настроим две серии и затем передадим их в DataFrame. Первой серией будет наша предыдущая серияavg_ocean_depth
, а второй -max_ocean_depth
, которая содержит данные о максимальной глубине каждого океана на Земле в метрах.
ocean.py
import numpy as np
import pandas as pd
avg_ocean_depth = pd.Series({
'Arctic': 1205,
'Atlantic': 3646,
'Indian': 3741,
'Pacific': 4080,
'Southern': 3270
})
max_ocean_depth = pd.Series({
'Arctic': 5567,
'Atlantic': 8486,
'Indian': 7906,
'Pacific': 10803,
'Southern': 7075
})
Настроив эти две серии, давайте добавим DataFrame в конец файла под сериейmax_ocean_depth
. В нашем примере обе эти серии имеют одинаковые метки индекса, но если у вас есть серии с разными метками, то отсутствующие значения будут помечены какNaN
.
Это сконструировано таким образом, что мы можем включать метки столбцов, которые мы объявляем как ключи к переменным Серии. Чтобы увидеть, как выглядит DataFrame, давайте позвоним, чтобы распечатать его.
ocean.py
...
max_ocean_depth = pd.Series({
'Arctic': 5567,
'Atlantic': 8486,
'Indian': 7906,
'Pacific': 10803,
'Southern': 7075
})
ocean_depths = pd.DataFrame({
'Avg. Depth (m)': avg_ocean_depth,
'Max. Depth (m)': max_ocean_depth
})
print(ocean_depths)
Output Avg. Depth (m) Max. Depth (m)
Arctic 1205 5567
Atlantic 3646 8486
Indian 3741 7906
Pacific 4080 10803
Southern 3270 7075
Выходные данные показывают заголовки двух наших столбцов вместе с числовыми данными под каждым, а метки от словарных клавиш находятся слева.
Сортировка данных в фреймах данных
Мы можемsort the data in the DataFrame, используя функциюDataFrame.sort_values(by=...)
.
Например, давайте использовать логический параметрascending
, который может иметь значениеTrue
илиFalse
. Обратите внимание, чтоascending
- это параметр, который мы можем передать функции, но по убыванию - нет.
ocean_depth.py
...
print(ocean_depths.sort_values('Avg. Depth (m)', ascending=True))
Output Avg. Depth (m) Max. Depth (m)
Arctic 1205 5567
Southern 3270 7075
Atlantic 3646 8486
Indian 3741 7906
Pacific 4080 10803
Теперь выходные данные показывают числа, возрастающие от низких значений до высоких значений в крайнем левом столбце целых чисел.
Статистический анализ с фреймами данных
Затем давайте посмотрим наsome summary statistics, который мы можем получить изpandas
с помощью функцииDataFrame.describe()
.
Без передачи определенных параметров функцияDataFrame.describe()
предоставит следующую информацию для числовых типов данных:
Вернуть | Что это значит |
---|---|
|
Подсчет частоты; сколько раз что-то происходит |
|
Среднее или среднее |
|
Стандартное отклонение, числовое значение, используемое для обозначения разницы в данных. |
|
Минимальное или наименьшее число в наборе |
|
25-й процентиль |
|
50-й процентиль |
|
75-й процентиль |
|
Максимальное или наибольшее число в наборе |
Пусть Python распечатает для нас эти статистические данные, вызвав наш DataFrameocean_depths
с функциейdescribe()
:
ocean.py
...
print(ocean_depths.describe())
Когда мы запустим эту программу, мы получим следующий вывод:
Output Avg. Depth (m) Max. Depth (m)
count 5.000000 5.000000
mean 3188.400000 7967.400000
std 1145.671113 1928.188347
min 1205.000000 5567.000000
25% 3270.000000 7075.000000
50% 3646.000000 7906.000000
75% 3741.000000 8486.000000
max 4080.000000 10803.000000
Теперь вы можете сравнить выходные данные с исходным DataFrame и получить лучшее представление о средней и максимальной глубинах земных океанов, если рассматривать их как группу.
Обработка пропущенных значений
Часто при работе с данными у вас будут отсутствующие значения. Пакетpandas
предоставляет множество различных способов дляworking with missing data, который относится к даннымnull
или данным, которые отсутствуют по какой-либо причине. Вpandas
это называется данными NA и отображается какNaN
.
Мы пройдем черезdropping missing values с функциейDataFrame.dropna()
иfilling missing values с функциейDataFrame.fillna()
. Это гарантирует, что вы не столкнетесь с проблемами при начале работы.
Давайте создадим новый файл с именемuser_data.py
, заполним его некоторыми данными с пропущенными значениями и превратим его в DataFrame:
user_data.py
import numpy as np
import pandas as pd
user_data = {'first_name': ['Sammy', 'Jesse', np.nan, 'Jamie'],
'last_name': ['Shark', 'Octopus', np.nan, 'Mantis shrimp'],
'online': [True, np.nan, False, True],
'followers': [987, 432, 321, np.nan]}
df = pd.DataFrame(user_data, columns = ['first_name', 'last_name', 'online', 'followers'])
print(df)
Наш вызов print показывает нам следующий вывод при запуске программы:
Output first_name last_name online followers
0 Sammy Shark True 987.0
1 Jesse Octopus NaN 432.0
2 NaN NaN False 321.0
3 Jamie Mantis shrimp True NaN
Здесь довольно много пропущенных значений.
Давайте сначала отбросим пропущенные значения с помощьюdropna()
.
user_data.py
...
df_drop_missing = df.dropna()
print(df_drop_missing)
Поскольку в нашем небольшом наборе данных есть только одна строка, в которой отсутствуют значения, это единственная строка, которая остается неизменной при запуске программы:
Output first_name last_name online followers
0 Sammy Shark True 987.0
В качестве альтернативы отбрасыванию значений мы можем вместо этого заполнить отсутствующие значения значением по нашему выбору, например0
. Этого мы добьемся с помощьюDataFrame.fillna(0)
.
Удалите или закомментируйте последние две строки, которые мы добавили в наш файл, и добавьте следующее:
user_data.py
...
df_fill = df.fillna(0)
print(df_fill)
Когда мы запустим программу, мы получим следующий вывод:
Output first_name last_name online followers
0 Sammy Shark True 987.0
1 Jesse Octopus 0 432.0
2 0 0 False 321.0
3 Jamie Mantis shrimp True 0.0
Теперь все наши столбцы и строки не повреждены, и вместоNaN
в качестве значений у нас теперь есть0
, заполняющий эти пространства. Вы заметите, что поплавки используются, когда это необходимо.
На этом этапе вы можете сортировать данные, выполнять статистический анализ и обрабатывать пропущенные значения в фреймах данных.
Заключение
В этом руководстве была представлена вводная информация для анализа данных с помощьюpandas
и Python 3. Теперь у вас должен быть установленpandas
, и вы можете работать со структурами данных Series и DataFrames в пределахpandas
.