Предварительное машинное обучение (4): освойте использование Pandas в одной статье.

pandas

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

Начнем с рассмотрения математических формул, которые есть в нашем распоряжении.

среднее (среднее):

xˉ=i=1nxin\bar x = \frac{\sum_{i=1}^{n}{x_i}}{n}

дисперсия:

s2=i=1n(xixˉ)2ns^2 = \frac{\sum_{i=1}^{n}{(x_i -\bar x)^2}}{n}

стандартное отклонение (станд.):

s=i=1n(xixˉ)2ns = \sqrt{\frac{\sum_{i=1}^{n}{(x_i -\bar x)^2}}{n}}

Давайте объясним значение каждого атрибута статистики описания панд. мы используем только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метод для демонстрации. Здесь следует отметить две вещи:

  1. Метод plot — это метод plot, вызываемый Pandas, а не matplotlib.
  2. Мы знаем, что языку Python не нужны точки с запятой для окончания операторов. Точка с запятой здесь означает, что после выполнения рендеринга чертежаотображать напрямуюизображение.
df.plot();

df.plot.bar();

df.plot.bar(stacked=True);

4. Еще

В нашей следующей статье будут объяснены соответствующие точки знаний о matplotlib, добро пожаловать на вниманиеСерия предварительных руководств по машинному обучению, или мой личный блогblog.caiyongji.com/Обновление синхронизации.