Pandas обеспечивает быстрый, гибкий и выразительныйструктура данных, мощныйанализ данныхБиблиотека Python.
Эта статья включена вСерия предварительных руководств по машинному обучению.
1. Серии и DataFrame
Pandas построен на NumPy и не толькоNumPyДля получения соответствующих знаний, пожалуйста, обратитесь к статьям, которые я написал ранееПредварительное машинное обучение (3): освоение стандартного использования NumPy за 30 минут..
Pandas особенно подходит для обработки табличных данных, таких как таблицы SQL и таблицы EXCEL. Упорядоченные или неупорядоченные временные ряды. Произвольные матричные данные с метками строк и столбцов.
Откройте Jupyter Notebook и импортируйте numpy и pandas, чтобы начать наше руководство:
import numpy as np
import pandas as pd
1. pandas.Series
Series — это одномерный массив ndarray с индексами. Значение индекса может быть не уникальным, но должно быть хэшируемым.
pd.Series([1, 3, 5, np.nan, 6, 8])
вывод:
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
Мы видим, что значения индекса по умолчанию — это числа вроде 0, 1, 2, 3, 4, 5. Добавить кindex
свойство в виде 'c','a','i','yong','j','i'.
pd.Series([1, 3, 5, np.nan, 6, 8], index=['c','a','i','yong','j','i'])
Вывод выглядит следующим образом, мы видим, что индекс повторяем.
c 1.0
a 3.0
i 5.0
yong NaN
j 6.0
i 8.0
dtype: float64
2. pandas.DataFrame
DataFrame представляет собой табличную структуру со строками и столбцами. Его можно понимать как словарную структуру из нескольких объектов Series.
pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), index=['i','ii','iii'], columns=['A', 'B', 'C'])
Выходная таблица выглядит следующим образом, гдеindex
соответствующая ему строка,columns
соответствующий его столбцу.
A | B | C | |
---|---|---|---|
i | 1 | 2 | 3 |
ii | 4 | 5 | 6 |
iii | 7 | 8 | 9 |
2. Обычное использование панд
1. Доступ к данным
Чтобы подготовить данные, случайным образом сгенерируйте двумерный массив с 6 строками и 4 столбцами, метки строк — даты от 20210101 до 20210106, а метки столбцов — A, B, C, D.
import numpy as np
import pandas as pd
np.random.seed(20201212)
df = pd.DataFrame(np.random.randn(6, 4), index=pd.date_range('20210101', periods=6), columns=list('ABCD'))
df
Форма отображения выглядит следующим образом:
A | B | C | D | |
---|---|---|---|---|
2021-01-01 | 0.270961 | -0.405463 | 0.348373 | 0.828572 |
2021-01-02 | 0.696541 | 0.136352 | -1.64592 | -0.69841 |
2021-01-03 | 0.325415 | -0.602236 | -0.134508 | 1.28121 |
2021-01-04 | -0.33032 | -1.40384 | -0.93809 | 1.48804 |
2021-01-05 | 0.348708 | 1.27175 | 0.626011 | -0.253845 |
2021-01-06 | -0.816064 | 1.30197 | 0.656281 | -1.2718 |
1.1 голова() и хвост()
Посмотрите на первые несколько строк таблицы:
df.head(2)
Форма отображения выглядит следующим образом:
A | B | C | D | |
---|---|---|---|---|
2021-01-01 | 0.270961 | -0.405463 | 0.348373 | 0.828572 |
2021-01-02 | 0.696541 | 0.136352 | -1.64592 | -0.69841 |
Посмотрите на последние несколько строк таблицы:
df.tail(3)
Форма отображения выглядит следующим образом:
A | B | C | D | |
---|---|---|---|---|
2021-01-04 | -0.33032 | -1.40384 | -0.93809 | 1.48804 |
2021-01-05 | 0.348708 | 1.27175 | 0.626011 | -0.253845 |
2021-01-06 | -0.816064 | 1.30197 | 0.656281 | -1.2718 |
1.2 describe()
describe
Этот метод используется для создания описательной статистики для DataFrame. Очень удобно просматривать распределение набора данных. Обратите внимание, что статистическое распределение здесь не содержитNaN
ценность.
df.describe()
Отображается следующим образом:
A | B | C | D | |
---|---|---|---|---|
count | 6 | 6 | 6 | 6 |
mean | 0.0825402 | 0.0497552 | -0.181309 | 0.22896 |
std | 0.551412 | 1.07834 | 0.933155 | 1.13114 |
min | -0.816064 | -1.40384 | -1.64592 | -1.2718 |
25% | -0.18 | -0.553043 | -0.737194 | -0.587269 |
50% | 0.298188 | -0.134555 | 0.106933 | 0.287363 |
75% | 0.342885 | 0.987901 | 0.556601 | 1.16805 |
max | 0.696541 | 1.30197 | 0.656281 | 1.48804 |
Начнем с рассмотрения математических формул, которые есть в нашем распоряжении.
среднее (среднее):
дисперсия:
стандартное отклонение (станд.):
Давайте объясним значение каждого атрибута статистики описания панд. мы используем толькоA
Например.
-
count
Представляет счет. Столбец A содержит 6 непустых данных. -
mean
представляет среднее значение. Среднее значение всех ненулевых данных в столбце A равно 0,0825402. -
std
представляет собой стандартное отклонение. Стандартное отклонение столбца А равно 0,551412. -
min
представляет минимальное значение. Столбец A имеет минимальное значение -0,816064. То есть 0% данных меньше -0,816064. -
25%
Указывает квартиль. Квартиль для столбца А равен -0,18. То есть 25% данных меньше -0,18. -
50%
Представляет квантиль 1/2. Квартиль для столбца А равен 0,298188. То есть 50% данных меньше 0,298188. -
75%
Указывает квартили. Квартиль для столбца А равен 0,342885. То есть 75% данных меньше 0,342885. -
max
представляет максимальное значение. Максимальное значение для столбца A равно 0,696541. То есть 100% данных меньше 0,696541.
1.3 T
T
обычно выражаютTranspose
Аббревиатура транспонирования. преобразование строки в столбец.
df.T
Форма отображения выглядит следующим образом:
2021-01-01 | 2021-01-02 | 2021-01-03 | 2021-01-04 | 2021-01-05 | 2021-01-06 | |
---|---|---|---|---|---|---|
A | 0.270961 | 0.696541 | 0.325415 | -0.33032 | 0.348708 | -0.816064 |
B | -0.405463 | 0.136352 | -0.602236 | -1.40384 | 1.27175 | 1.30197 |
C | 0.348373 | -1.64592 | -0.134508 | -0.93809 | 0.626011 | 0.656281 |
D | 0.828572 | -0.69841 | 1.28121 | 1.48804 | -0.253845 | -1.2718 |
1.4 sort_values()
Укажите столбец для сортировки, следующий код основан наC
Столбцы сортируются в положительном порядке.
df.sort_values(by='C')
Форма отображения выглядит следующим образом:
A | B | C | D | |
---|---|---|---|---|
2021-01-02 | 0.696541 | 0.136352 | -1.64592 | -0.69841 |
2021-01-04 | -0.33032 | -1.40384 | -0.93809 | 1.48804 |
2021-01-03 | 0.325415 | -0.602236 | -0.134508 | 1.28121 |
2021-01-01 | 0.270961 | -0.405463 | 0.348373 | 0.828572 |
2021-01-05 | 0.348708 | 1.27175 | 0.626011 | -0.253845 |
2021-01-06 | -0.816064 | 1.30197 | 0.656281 | -1.2718 |
1.5 nlargest()
Выберите самые большие n строк данных в столбце. как:df.nlargest(2,'A')
Указывает, что возвращаются 2 самые большие строки данных в столбце A.
df.nlargest(2,'A')
Форма отображения выглядит следующим образом:
A | B | C | D | |
---|---|---|---|---|
2021-01-02 | 0.696541 | 0.136352 | -1.64592 | -0.69841 |
2021-01-05 | 0.348708 | 1.27175 | 0.626011 | -0.253845 |
1.6 sample()
sample
Метод означает просмотр случайных выборочных данных.
df.sample(5)
Указывает, что возвращаются 5 случайных строк данных.
df.sample(5)
параметрfrac
Обозначает дробь, значение дроби. frac=0.01 возвращает 1% случайных данных в качестве выборки.
df.sample(frac=0.01)
2. Выберите данные
2.1 Выбор по метке
мы входимdf['A']
команда для выбора столбца A.
df['A']
Выходной столбец Данные, которые также являются объектом Series:
2021-01-01 0.270961
2021-01-02 0.696541
2021-01-03 0.325415
2021-01-04 -0.330320
2021-01-05 0.348708
2021-01-06 -0.816064
Name: A, dtype: float64
df[0:3]
Этот код такой же, какdf.head(3)
То же самое справедливо. ноdf[0:3]
— это метод выбора массива NumPy, который показывает, что Pandas хорошо поддерживает NumPy.
df[0:3]
Форма отображения выглядит следующим образом:
A | B | C | D | |
---|---|---|---|---|
2021-01-01 | 0.270961 | -0.405463 | 0.348373 | 0.828572 |
2021-01-02 | 0.696541 | 0.136352 | -1.64592 | -0.69841 |
2021-01-03 | 0.325415 | -0.602236 | -0.134508 | 1.28121 |
Укажите метки строк и столбцов с помощью метода loc.
df.loc['2021-01-01':'2021-01-02', ['A', 'B']]
Форма отображения выглядит следующим образом:
A | B | |
---|---|---|
2021-01-01 | 0.270961 | -0.405463 |
2021-01-02 | 0.696541 | 0.136352 |
2.2 Выбирайте по местоположению
iloc
иloc
разные.loc
указать конкретные теги, в то время какiloc
Определяет позицию индекса метки.df.iloc[3:5, 0:3]
Указывает, что выбрана строка с индексом 3 и 4 и выбран столбец с индексом 0, 1 и 2. То есть строки 4, 5, столбцы 1, 2 и 3.
Обратите внимание, что номера индексов начинаются с 0. Двоеточие представляет интервал, а левая и правая стороны представляют начало и конец соответственно. как3:5
Указывает левый открытый и правый закрытый интервал[3,5)
, то есть не содержит самого 5.
df.iloc[3:5, 0:3]
A | B | C | |
---|---|---|---|
2021-01-04 | -0.33032 | -1.40384 | -0.93809 |
2021-01-05 | 0.348708 | 1.27175 | 0.626011 |
df.iloc[:, 1:3]
B | C | |
---|---|---|
2021-01-01 | -0.405463 | 0.348373 |
2021-01-02 | 0.136352 | -1.64592 |
2021-01-03 | -0.602236 | -0.134508 |
2021-01-04 | -1.40384 | -0.93809 |
2021-01-05 | 1.27175 | 0.626011 |
2021-01-06 | 1.30197 | 0.656281 |
2.3 Логическое индексирование
DataFrame можно фильтровать в соответствии с условиями, когда оцениваются условияTrue
, возвращение. Когда состояние оценивается какFalse
, отфильтровано.
Мы настраиваем фильтр, чтобы определить, больше ли столбец A 0.
filter = df['A'] > 0
filter
Вывод выглядит следующим образом, вы можете видеть2021-01-04
и2021-01-06
Поведение ложное.
2021-01-01 True
2021-01-02 True
2021-01-03 True
2021-01-04 False
2021-01-05 True
2021-01-06 False
Name: A, dtype: bool
Смотрим набор данных по фильтрам.
df[filter]
# df[df['A'] > 0]
Глядя на таблицу, мы можем найти, что,2021-01-04
и2021-01-06
Строки отфильтровываются.
A | B | C | D | |
---|---|---|---|---|
2021-01-01 | 0.270961 | -0.405463 | 0.348373 | 0.828572 |
2021-01-02 | 0.696541 | 0.136352 | -1.64592 | -0.69841 |
2021-01-03 | 0.325415 | -0.602236 | -0.134508 | 1.28121 |
2021-01-05 | 0.348708 | 1.27175 | 0.626011 | -0.253845 |
3. Обработка пропущенных значений
Подготовьте данные.
df2 = df.copy()
df2.loc[:3, 'E'] = 1.0
f_series = {'2021-01-02': 1.0,'2021-01-03': 2.0,'2021-01-04': 3.0,'2021-01-05': 4.0,'2021-01-06': 5.0}
df2['F'] = pd.Series(f_series)
df2
Форма отображения выглядит следующим образом:
A | B | C | D | F | E | |
---|---|---|---|---|---|---|
2021-01-01 | 0.270961 | -0.405463 | 0.348373 | 0.828572 | nan | 1 |
2021-01-02 | 0.696541 | 0.136352 | -1.64592 | -0.69841 | 1 | 1 |
2021-01-03 | 0.325415 | -0.602236 | -0.134508 | 1.28121 | 2 | 1 |
2021-01-04 | -0.33032 | -1.40384 | -0.93809 | 1.48804 | 3 | nan |
2021-01-05 | 0.348708 | 1.27175 | 0.626011 | -0.253845 | 4 | nan |
2021-01-06 | -0.816064 | 1.30197 | 0.656281 | -1.2718 | 5 | nan |
3.1 dropna()
Используйте метод dropna для очистки значений NaN. Примечание. Метод dropa возвращает новый кадр данных и не изменяет исходный кадр данных.
df2.dropna(how='any')
Приведенный выше код указывает, что когда какое-либо значение в данных строки пусто, удалите его.
A | B | C | D | F | E | |
---|---|---|---|---|---|---|
2021-01-02 | 0.696541 | 0.136352 | -1.64592 | -0.69841 | 1 | 1 |
2021-01-03 | 0.325415 | -0.602236 | -0.134508 | 1.28121 | 2 | 1 |
3.2 fillna()
Используйте команду filna для заполнения значений NaN.
df2.fillna(df2.mean())
Приведенный выше код означает, что среднее значение каждого столбца используется для заполнения пробелов. Точно так же fillna не будет обновлять исходный DataFrame, если вам нужно обновить исходный DataFrame, используйте кодdf2 = df2.fillna(df2.mean())
.
Форма отображения выглядит следующим образом:
A | B | C | D | F | E | |
---|---|---|---|---|---|---|
2021-01-01 | 0.270961 | -0.405463 | 0.348373 | 0.828572 | 3 | 1 |
2021-01-02 | 0.696541 | 0.136352 | -1.64592 | -0.69841 | 1 | 1 |
2021-01-03 | 0.325415 | -0.602236 | -0.134508 | 1.28121 | 2 | 1 |
2021-01-04 | -0.33032 | -1.40384 | -0.93809 | 1.48804 | 3 | 1 |
2021-01-05 | 0.348708 | 1.27175 | 0.626011 | -0.253845 | 4 | 1 |
2021-01-06 | -0.816064 | 1.30197 | 0.656281 | -1.2718 | 5 | 1 |
4. Как работать
4.1 agg()
agg — это сокращение от Aggregate, что означает агрегирование.
Общие методы агрегации следующие:
- mean(): Compute mean of groups
- sum(): Compute sum of group values
- size(): Compute group sizes
- count(): Compute count of group
- std(): Standard deviation of groups
- var(): Compute variance of groups
- sem(): Standard error of the mean of groups
- describe(): Generates descriptive statistics
- first(): Compute first of group values
- last(): Compute last of group values
- nth() : Take nth value, or a subset if n is a list
- min(): Compute min of group values
- max(): Compute max of group values
df.mean()
Возвращает среднее значение каждого столбца
A 0.082540
B 0.049755
C -0.181309
D 0.228960
dtype: float64
Среднее значение строки можно просмотреть, добавив ось параметра.
df.mean(axis=1)
вывод:
2021-01-01 0.260611
2021-01-02 -0.377860
2021-01-03 0.217470
2021-01-04 -0.296053
2021-01-05 0.498156
2021-01-06 -0.032404
dtype: float64
Что, если мы хотим увидеть несколько агрегированных статистических данных для столбца?
В этот момент мы можем позвонитьaggметод:
df.agg(['std','mean'])['A']
Возвращенный результат показывает стандартное отклонение std и среднее значение:
std 0.551412
mean 0.082540
Name: A, dtype: float64
Примените разные агрегатные функции для разных столбцов:
df.agg({'A':['max','mean'],'B':['mean','std','var']})
Возвращаемые результаты следующие:
A | B | |
---|---|---|
max | 0.696541 | nan |
mean | 0.0825402 | 0.0497552 |
std | nan | 1.07834 |
var | nan | 1.16281 |
4.2 apply()
apply() — это вызов метода.
какdf.apply(np.sum)
Указывает, что каждый столбец вызывает метод np.sum и возвращает числовую сумму каждого столбца.
df.apply(np.sum)
Результат:
A 0.495241
B 0.298531
C -1.087857
D 1.373762
dtype: float64
Метод применения поддерживает лямбда-выражения.
df.apply(lambda n: n*2)
A | B | C | D | |
---|---|---|---|---|
2021-01-01 | 0.541923 | -0.810925 | 0.696747 | 1.65714 |
2021-01-02 | 1.39308 | 0.272704 | -3.29185 | -1.39682 |
2021-01-03 | 0.65083 | -1.20447 | -0.269016 | 2.56242 |
2021-01-04 | -0.66064 | -2.80768 | -1.87618 | 2.97607 |
2021-01-05 | 0.697417 | 2.5435 | 1.25202 | -0.50769 |
2021-01-06 | -1.63213 | 2.60393 | 1.31256 | -2.5436 |
4.3 value_counts()
Метод value_counts проверяет повторяющуюся статистику значений каждой строки и столбца. Мы регенерируем некоторые целочисленные данные, чтобы обеспечить определенное количество повторений данных.
np.random.seed(101)
df3 = pd.DataFrame(np.random.randint(0,9,size = (6,4)),columns=list('ABCD'))
df3
A | B | C | D | |
---|---|---|---|---|
0 | 1 | 6 | 7 | 8 |
1 | 4 | 8 | 5 | 0 |
2 | 5 | 8 | 1 | 3 |
3 | 8 | 3 | 3 | 2 |
4 | 8 | 3 | 7 | 0 |
5 | 7 | 8 | 4 | 3 |
Вызовите метод value_counts().
df3['A'].value_counts()
Глядя на вывод, мы видим, что есть два числа 8 в столбце A и 1 для других чисел.
8 2
7 1
5 1
4 1
1 1
Name: A, dtype: int64
4.4 str
Pandas имеет встроенные методы обработки строк.
names = pd.Series(['andrew','bobo','claire','david','4'])
names.str.upper()
С помощью приведенного выше кода мы устанавливаем все строки в Series в верхнем регистре.
0 ANDREW
1 BOBO
2 CLAIRE
3 DAVID
4 4
dtype: object
Сделать первую букву заглавной:
names.str.capitalize()
Результат:
0 Andrew
1 Bobo
2 Claire
3 David
4 4
dtype: object
Определить, является ли это числом:
names.str.isdigit()
Результат:
0 False
1 False
2 False
3 False
4 True
dtype: bool
Разделение строки:
tech_finance = ['GOOG,APPL,AMZN','JPM,BAC,GS']
tickers = pd.Series(tech_finance)
tickers.str.split(',').str[0:2]
Разделив строку запятыми, результат будет таким:
0 [GOOG, APPL]
1 [JPM, BAC]
dtype: object
5. Слияние
5.1 concat()
concat используется для объединения наборов данных. Сначала подготовим данные.
data_one = {'Col1': ['A0', 'A1', 'A2', 'A3'],'Col2': ['B0', 'B1', 'B2', 'B3']}
data_two = {'Col1': ['C0', 'C1', 'C2', 'C3'], 'Col2': ['D0', 'D1', 'D2', 'D3']}
one = pd.DataFrame(data_one)
two = pd.DataFrame(data_two)
Используйте метод concat для объединения двух наборов данных.
pt(pd.concat([one,two]))
чтобы получить форму:
Col1 | Col2 | |
---|---|---|
0 | A0 | B0 |
1 | A1 | B1 |
2 | A2 | B2 |
3 | A3 | B3 |
0 | C0 | D0 |
1 | C1 | D1 |
2 | C2 | D2 |
3 | C3 | D3 |
5.2 merge()
слияние эквивалентно методу соединения в операциях SQL, который используется для соединения двух наборов данных через отношение.
registrations = pd.DataFrame({'reg_id':[1,2,3,4],'name':['Andrew','Bobo','Claire','David']})
logins = pd.DataFrame({'log_id':[1,2,3,4],'name':['Xavier','Andrew','Yolanda','Bobo']})
Мы основаны наname
Чтобы соединить две таблицы, метод соединенияouter
.
pd.merge(left=registrations, right=logins, how='outer',on='name')
Возвращаемый результат:
reg_id | name | log_id | |
---|---|---|---|
0 | 1 | Andrew | 2 |
1 | 2 | Bobo | 4 |
2 | 3 | Claire | nan |
3 | 4 | David | nan |
4 | nan | Xavier | 1 |
5 | nan | Yolanda | 3 |
Мы заметили,how : {'left', 'right', 'outer', 'inner'}Есть 4 способа подключения. Указывает, следует ли выбирать значение nan для левой и правой таблиц. Например, "слева" означает, что все данные в таблице слева должны быть сохранены. Если данные в таблице справа имеют значение nan, данные справа не отображаются. Проще говоря, подумайте о левой и правой таблицах как о двух наборах.
- left означает взять весь набор левой таблицы + пересечение двух таблиц
- right означает взять весь набор правой таблицы + пересечение двух таблиц
- внешние средства для объединения двух таблиц
- внутренний означает пересечение двух таблиц
6. Группировать по GroupBy
Функциональность группировки в Pandas очень похожа на операторы SQL.SELECT Column1, Column2, mean(Column3), sum(Column4)FROM SomeTableGROUP BY Column1, Column2
. Неважно, даже если вы не знакомы с SQL, группировка эквивалентна процессу разбиения, подсчета и слияния данных таблицы по определенному столбцу.
Подготовьте данные.
np.random.seed(20201212)
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C': np.random.randn(8),
'D': np.random.randn(8)})
df
Как видите, у нас много повторяющихся данных в столбцах A и B. На этом этапе мы можем сгруппировать по foo/bar или one/two.
A | B | C | D | |
---|---|---|---|---|
0 | foo | one | 0.270961 | 0.325415 |
1 | bar | one | -0.405463 | -0.602236 |
2 | foo | two | 0.348373 | -0.134508 |
3 | bar | three | 0.828572 | 1.28121 |
4 | foo | two | 0.696541 | -0.33032 |
5 | bar | two | 0.136352 | -1.40384 |
6 | foo | one | -1.64592 | -0.93809 |
7 | foo | three | -0.69841 | 1.48804 |
6.1 Группировка по одному столбцу
мы применяемgroupby
Метод группирует данные в таблице выше.
df.groupby('A')
Как вы можете видеть, выполнив приведенный выше код, метод groupby возвращает типDataFrameGroupBy
Объект. Мы не можем смотреть напрямую, нам нужно применять агрегатные функции. См. раздел 4.1 этой статьи.
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000014C6742E248>
Попробуем использовать агрегатную функцию sum.
df.groupby('A').sum()
Форма отображения выглядит следующим образом:
A | C | D |
---|---|---|
bar | 0.559461 | -0.724868 |
foo | -1.02846 | 0.410533 |
6.2 Группировка по нескольким столбцам
groupby
Метод поддерживает передачу нескольких столбцов в качестве параметров.
df.groupby(['A', 'B']).sum()
После группировки результаты отображаются следующим образом:
A | B | C | D |
---|---|---|---|
bar | one | -0.405463 | -0.602236 |
one | -0.405463 | -0.602236 | |
three | 0.828572 | 1.28121 | |
two | 0.136352 | -1.40384 | |
foo | one | -1.37496 | -0.612675 |
three | -0.69841 | 1.48804 | |
two | 1.04491 | -0.464828 |
6.3 Применение подхода с несколькими агрегациями
мы применяемagg()
, передавая массив методов агрегации в качестве параметра методу. Приведенный ниже код классифицируется в соответствии с A и учитывается толькоC
значение столбца.
df.groupby('A')['C'].agg([np.sum, np.mean, np.std])
Вы можете видеть, что результаты агрегатных функций группы bar и группы foo следующие:
A | sum | mean | std |
---|---|---|---|
bar | 0.559461 | 0.186487 | 0.618543 |
foo | -1.02846 | -0.205692 | 0.957242 |
6.4 Разная совокупная статистика для разных столбцов
Следующий код выполняет различную агрегированную статистику для столбцов C и D, суммирует столбец C и выполняет статистику стандартного отклонения для столбца D.
df.groupby('A').agg({'C': 'sum', 'D': lambda x: np.std(x, ddof=1)})
Результат выглядит следующим образом:
A | C | D |
---|---|---|
bar | 0.559461 | 1.37837 |
foo | -1.02846 | 0.907422 |
6.5 Еще
Подробнее о пандахgoupby
Пожалуйста, обратитесь к официальному сайту для метода:pandas.друзья попали на него.org/pandas-docs…
3. Расширенное использование Pandas
1. reshape
reshape
Представляет таблицу изменения формы. Для сложных таблиц нам нужно преобразовать их во что-то подходящее для нашего понимания, например, сгруппировать их по определенным признакам для отдельной статистики.
1.1 stack() и unstack()
stack
Метод делит таблицу на две части: индекс и данные. Столбцы индекса сохраняются, данныекучаместо.
Подготовьте данные.
tuples = list(zip(*[['bar', 'bar', 'baz', 'baz','foo', 'foo', 'qux', 'qux'],
['one', 'two', 'one', 'two','one', 'two', 'one', 'two']]))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
На основе приведенного выше кода мы создаем составной индекс.
MultiIndex([('bar', 'one'),
('bar', 'two'),
('baz', 'one'),
('baz', 'two'),
('foo', 'one'),
('foo', 'two'),
('qux', 'one'),
('qux', 'two')],
names=['first', 'second'])
Мы создаем DataFrame с составным индексом.
np.random.seed(20201212)
df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])
df
Результат выглядит следующим образом:
A | B | C | D |
---|---|---|---|
bar | one | 0.270961 | -0.405463 |
two | 0.348373 | 0.828572 | |
baz | one | 0.696541 | 0.136352 |
two | -1.64592 | -0.69841 | |
foo | one | 0.325415 | -0.602236 |
two | -0.134508 | 1.28121 | |
qux | one | -0.33032 | -1.40384 |
two | -0.93809 | 1.48804 |
мы выступаемstack
метод.
stacked = df.stack()
stacked
Выходная сложенная (сжатая) таблица выглядит следующим образом.Примечание. Выходные данные Jupyter Notebook/Lab могут отличаться от приведенных ниже. У людей в выводе ниже есть некоторые корректировки для удобства отображения в Markdown.
first second
bar one A 0.942502
bar one B 0.060742
bar two A 1.340975
bar two B -1.712152
baz one A 1.899275
baz one B 1.237799
baz two A -1.589069
baz two B 1.288342
foo one A -0.326792
foo one B 1.576351
foo two A 1.526528
foo two B 1.410695
qux one A 0.420718
qux one B -0.288002
qux two A 0.361586
qux two B 0.177352
dtype: float64
Мы выполняем unstack для расширения данных.
stacked.unstack()
Выведите исходную форму.
A | B | C | D |
---|---|---|---|
bar | one | 0.270961 | -0.405463 |
two | 0.348373 | 0.828572 | |
baz | one | 0.696541 | 0.136352 |
two | -1.64592 | -0.69841 | |
foo | one | 0.325415 | -0.602236 |
two | -0.134508 | 1.28121 | |
qux | one | -0.33032 | -1.40384 |
two | -0.93809 | 1.48804 |
Добавляем параметрыlevel
.
stacked.unstack(level=0)
#stacked.unstack(level=1)
когдаlevel=0
Когда вы получите следующий вывод, вы можете попробоватьlevel=1
что выводить.
second | first | bar | baz | foo | qux |
---|---|---|---|---|---|
one | A | 0.942502 | 1.89927 | -0.326792 | 0.420718 |
one | B | 0.060742 | 1.2378 | 1.57635 | -0.288002 |
two | A | 1.34097 | -1.58907 | 1.52653 | 0.361586 |
two | B | -1.71215 | 1.28834 | 1.4107 | 0.177352 |
1.2 pivot_table()
сводная_таблица представляет собой сводную таблицу, которая представляет собой таблицу формата, которая динамически упорядочивает данные и подводит промежуточные итоги.
Мы генерируем DataFrame без индексированных столбцов.
np.random.seed(99)
df = pd.DataFrame({'A': ['one', 'one', 'two', 'three'] * 3,
'B': ['A', 'B', 'C'] * 4,
'C': ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2,
'D': np.random.randn(12),
'E': np.random.randn(12)})
df
Форма отображения выглядит следующим образом:
A | B | C | D | E | |
---|---|---|---|---|---|
0 | one | A | foo | -0.142359 | 0.0235001 |
1 | one | B | foo | 2.05722 | 0.456201 |
2 | two | C | foo | 0.283262 | 0.270493 |
3 | three | A | bar | 1.32981 | -1.43501 |
4 | one | B | bar | -0.154622 | 0.882817 |
5 | one | C | bar | -0.0690309 | -0.580082 |
6 | two | A | foo | 0.75518 | -0.501565 |
7 | three | B | foo | 0.825647 | 0.590953 |
8 | one | C | foo | -0.113069 | -0.731616 |
9 | one | A | bar | -2.36784 | 0.261755 |
10 | two | B | bar | -0.167049 | -0.855796 |
11 | three | C | bar | 0.685398 | -0.187526 |
Наблюдая за данными, мы можем четко заключить, что столбцы A, B и C имеют определенные значения атрибутов. мы выступаемpivot_table
метод.
pd.pivot_table(df, values=['D','E'], index=['A', 'B'], columns=['C'])
Приведенный выше код означает, что столбцы D и E используются в качестве столбцов данных, а A и B — в качестве составных индексов строк.значение данных Cкак индекс столбца.
('D', 'bar') | ('D', 'foo') | ('E', 'bar') | ('E', 'foo') | |
---|---|---|---|---|
('one', 'A') | -2.36784 | -0.142359 | 0.261755 | 0.0235001 |
('one', 'B') | -0.154622 | 2.05722 | 0.882817 | 0.456201 |
('one', 'C') | -0.0690309 | -0.113069 | -0.580082 | -0.731616 |
('three', 'A') | 1.32981 | nan | -1.43501 | nan |
('three', 'B') | nan | 0.825647 | nan | 0.590953 |
('three', 'C') | 0.685398 | nan | -0.187526 | nan |
('two', 'A') | nan | 0.75518 | nan | -0.501565 |
('two', 'B') | -0.167049 | nan | -0.855796 | nan |
('two', 'C') | nan | 0.283262 | nan | 0.270493 |
2. Временные ряды
date_range
Это метод, который поставляется с Pandas для генерации интервалов дат. Выполняем следующий код:
rng = pd.date_range('1/1/2021', periods=100, freq='S')
pd.Series(np.random.randint(0, 500, len(rng)), index=rng)
Метод date_range начинается с 0 секунд 1 января 2021 года и выполняет 100 делений периода времени с интервалом в 1 секунду. Результат выглядит следующим образом:
2021-01-01 00:00:00 475
2021-01-01 00:00:01 145
2021-01-01 00:00:02 13
2021-01-01 00:00:03 240
2021-01-01 00:00:04 183
...
2021-01-01 00:01:35 413
2021-01-01 00:01:36 330
2021-01-01 00:01:37 272
2021-01-01 00:01:38 304
2021-01-01 00:01:39 151
Freq: S, Length: 100, dtype: int32
мы будемfreq
Значение параметра изменяется с S (секунда) на M (месяц) и попробуйте.
rng = pd.date_range('1/1/2021', periods=100, freq='M')
pd.Series(np.random.randint(0, 500, len(rng)), index=rng)
вывод:
2021-01-31 311
2021-02-28 256
2021-03-31 327
2021-04-30 151
2021-05-31 484
...
2028-12-31 170
2029-01-31 492
2029-02-28 205
2029-03-31 90
2029-04-30 446
Freq: M, Length: 100, dtype: int32
Настраиваем генерацию даты с квартальной периодичностью.
prng = pd.period_range('2018Q1', '2020Q4', freq='Q-NOV')
pd.Series(np.random.randn(len(prng)), prng)
Вывод всех кварталов между первым кварталом 2018 года и четвертым кварталом 2020 года.
2018Q1 0.833025
2018Q2 -0.509514
2018Q3 -0.735542
2018Q4 -0.224403
2019Q1 -0.119709
2019Q2 -1.379413
2019Q3 0.871741
2019Q4 0.877493
2020Q1 0.577611
2020Q2 -0.365737
2020Q3 -0.473404
2020Q4 0.529800
Freq: Q-NOV, dtype: float64
3. Классификация
У Pandas есть специальный тип данных, называемый «категория», то есть dtype = «category», мы классифицируем, устанавливая определенные столбцы как категории.
Подготовьте данные.
df = pd.DataFrame({"id": [1, 2, 3, 4, 5, 6], "raw_grade": ['a', 'b', 'b', 'a', 'a', 'e']})
df
id | raw_grade | |
---|---|---|
0 | 1 | a |
1 | 2 | b |
2 | 3 | b |
3 | 4 | a |
4 | 5 | a |
5 | 6 | e |
мы добавляем новый столбецgrade
и установите для него тип данныхcategory
.
df["grade"] = df["raw_grade"].astype("category")
df["grade"]
Мы видим, чтоgrade
В столбце всего 3 значения a,b,e.
0 a
1 b
2 b
3 a
4 a
5 e
Name: grade, dtype: category
Categories (3, object): ['a', 'b', 'e']
Мы заменяем a, b, e на очень хорошо, хорошо, очень плохо по порядку.
df["grade"].cat.categories = ["very good", "good", "very bad"]
На данный момент форма такая:
id | raw_grade | grade | |
---|---|---|---|
0 | 1 | a | very good |
1 | 2 | b | good |
2 | 3 | b | good |
3 | 4 | a | very good |
4 | 5 | a | very good |
5 | 6 | e | very bad |
Сортируем таблицу:
df.sort_values(by="grade", ascending=False)
id | raw_grade | grade | |
---|---|---|---|
5 | 6 | e | very bad |
1 | 2 | b | good |
2 | 3 | b | good |
0 | 1 | a | very good |
3 | 4 | a | very good |
4 | 5 | a | very good |
Обратите внимание на количество категорий:
df.groupby("grade").size()
Вывод приведенного выше кода:
grade
very good 3
good 2
very bad 1
dtype: int64
4. IO
Pandas поддерживает чтение и запись данных непосредственно из файлов, таких как CSV, JSON, EXCEL и другие форматы файлов. Форматы файлов, поддерживаемые Pandas, следующие.
Format Type | Data Description | Reader | Writer |
---|---|---|---|
text | CSV | read_csv | to_csv |
text | Fixed-Width Text File | read_fwf | |
text | JSON | read_json | to_json |
text | HTML | read_html | to_html |
text | Local clipboard | read_clipboard | to_clipboard |
MS Excel | read_excel | to_excel | |
binary | OpenDocument | read_excel | |
binary | HDF5 Format | read_hdf | to_hdf |
binary | Feather Format | read_feather | to_feather |
binary | Parquet Format | read_parquet | to_parquet |
binary | ORC Format | read_orc | |
binary | Msgpack | read_msgpack | to_msgpack |
binary | Stata | read_stata | to_stata |
binary | SAS | read_sas | |
binary | SPSS | read_spss | |
binary | Python Pickle Format | read_pickle | to_pickle |
SQL | SQL | read_sql | to_sql |
SQL | Google BigQuery | read_gbq | to_gbq |
Мы используем файлы CSV только в качестве примера для объяснения. Другие форматы см. в таблице выше.
Мы импортируем данные из файлов CSV.Вам не нужно обращать особое внимание на адрес доменного имени следующего URL.
df = pd.read_csv("http://blog.caiyongji.com/assets/housing.csv")
Просмотрите первые 5 строк данных:
df.head(5)
longitude | latitude | housing_median_age | total_rooms | total_bedrooms | population | households | median_income | median_house_value | ocean_proximity | |
---|---|---|---|---|---|---|---|---|---|---|
0 | -122.23 | 37.88 | 41 | 880 | 129 | 322 | 126 | 8.3252 | 452600 | NEAR BAY |
1 | -122.22 | 37.86 | 21 | 7099 | 1106 | 2401 | 1138 | 8.3014 | 358500 | NEAR BAY |
2 | -122.24 | 37.85 | 52 | 1467 | 190 | 496 | 177 | 7.2574 | 352100 | NEAR BAY |
3 | -122.25 | 37.85 | 52 | 1274 | 235 | 558 | 219 | 5.6431 | 341300 | NEAR BAY |
4 | -122.25 | 37.85 | 52 | 1627 | 280 | 565 | 259 | 3.8462 | 342200 | NEAR BAY |
5. Рисование
Pandas поддерживает matplotlib, мощный инструмент визуализации Python. В этом разделе только кратко представлены методы рисования, поддерживаемые Pandas, и мы подробно расскажем о matplotlib в следующей статье.Чтобы не пропустить обновление, подписывайтесь на меня.
np.random.seed(999)
df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
мы звоним напрямуюplot
метод для демонстрации.
Здесь следует отметить две вещи:
- Метод plot — это метод plot, вызываемый Pandas, а не matplotlib.
- Мы знаем, что языку Python не нужны точки с запятой для окончания операторов. Точка с запятой здесь означает, что после выполнения рендеринга чертежаотображать напрямуюизображение.
df.plot();
df.plot.bar();
df.plot.bar(stacked=True);
4. Еще
В нашей следующей статье будут объяснены соответствующие точки знаний о matplotlib, добро пожаловать на вниманиеСерия предварительных руководств по машинному обучению, или мой личный блогblog.caiyongji.com/Обновление синхронизации.