import pandas as pd
Для этого урока используется данные о качестве воздуха $NO_2$, данные предоставляются организацией openaq
и загружается с помощью модуля py-openaq
.
Набор данных air_quality_no2_long.csv
содержит значения $NO_2$ для измерительных станций FR04014
, BETR801
и London Westminster
соответственно в Париже, Антверпене и Лондоне.
url = "https://raw.githubusercontent.com/dm-fedorov/pandas_basic/master/%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5%20%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B2%20pandas/data/air_quality_no2_long.csv"
air_quality_no2 = pd.read_csv(url,
parse_dates=True)
air_quality_no2 = air_quality_no2[["date.utc", "location",
"parameter", "value"]]
air_quality_no2.head()
date.utc | location | parameter | value | |
---|---|---|---|---|
0 | 2019-06-21 00:00:00+00:00 | FR04014 | no2 | 20.0 |
1 | 2019-06-20 23:00:00+00:00 | FR04014 | no2 | 21.8 |
2 | 2019-06-20 22:00:00+00:00 | FR04014 | no2 | 26.5 |
3 | 2019-06-20 21:00:00+00:00 | FR04014 | no2 | 24.9 |
4 | 2019-06-20 20:00:00+00:00 | FR04014 | no2 | 21.4 |
Для этого урока также используются данные о качестве воздуха для твердых частиц размером менее 2,5 микрометров, данные предоставляются организацией openaq
и загружается с помощью модуля py-openaq
.
см. Частицы РМ2.5: что это, откуда и почему об этом все говорят
Набор данных air_quality_pm25_long.csv
содержит значения $PM_{2.5}$ для измерительных станций FR04014
, BETR801
и London Westminster
соответственно в Париже, Антверпене и Лондоне.
url = "https://raw.githubusercontent.com/dm-fedorov/pandas_basic/master/%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5%20%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B2%20pandas/data/air_quality_pm25_long.csv"
air_quality_pm25 = pd.read_csv(url,
parse_dates=True)
air_quality_pm25 = air_quality_pm25[["date.utc", "location",
"parameter", "value"]]
air_quality_pm25.head()
date.utc | location | parameter | value | |
---|---|---|---|---|
0 | 2019-06-18 06:00:00+00:00 | BETR801 | pm25 | 18.0 |
1 | 2019-06-17 08:00:00+00:00 | BETR801 | pm25 | 6.5 |
2 | 2019-06-17 07:00:00+00:00 | BETR801 | pm25 | 18.5 |
3 | 2019-06-17 06:00:00+00:00 | BETR801 | pm25 | 16.0 |
4 | 2019-06-17 05:00:00+00:00 | BETR801 | pm25 | 7.5 |
Я хочу объединить измерения $NO_2$ и $PM_{2.5}$ с похожей структурой в одну таблицу:
air_quality = pd.concat([air_quality_pm25, air_quality_no2], axis=0)
air_quality.head()
date.utc | location | parameter | value | |
---|---|---|---|---|
0 | 2019-06-18 06:00:00+00:00 | BETR801 | pm25 | 18.0 |
1 | 2019-06-17 08:00:00+00:00 | BETR801 | pm25 | 6.5 |
2 | 2019-06-17 07:00:00+00:00 | BETR801 | pm25 | 18.5 |
3 | 2019-06-17 06:00:00+00:00 | BETR801 | pm25 | 16.0 |
4 | 2019-06-17 05:00:00+00:00 | BETR801 | pm25 | 7.5 |
Функция concat()
выполняет операцию конкатенации нескольких таблиц вдоль одной оси (по строкам или столбцам).
По умолчанию конкатенация происходит вдоль оси 0
, поэтому результирующая таблица объединяет строки входных таблиц. Давайте проверим форму исходных и составных таблиц, чтобы проверить операцию:
print('Shape of the `air_quality_pm25` table: ', air_quality_pm25.shape)
Shape of the `air_quality_pm25` table: (1110, 4)
print('Shape of the `air_quality_no2` table: ', air_quality_no2.shape)
Shape of the `air_quality_no2` table: (2068, 4)
print('Shape of the resulting `air_quality` table: ', air_quality.shape)
Shape of the resulting `air_quality` table: (3178, 4)
Следовательно, результирующая таблица имеет 3178 = 1110 + 2068
строк.
Аргумент axis
встречается в ряде методов, которые могут применяться вдоль оси. DataFrame
имеет две соответствующие оси: первая, проходящая вертикально вниз по строкам (ось 0
), и вторая, проходящая горизонтально по столбцам (ось 1
). Большинство операций, таких как конкатенация или сводная статистика, по умолчанию выполняются по строкам (ось 0
), но также могут применяться к столбцам.
Сортировка таблицы по дате и времени иллюстрирует также комбинацию обеих таблиц, причем столбец parameter
определяет источник таблицы (либо no2
из таблицы air_quality_no2
, либо pm25
из таблицы air_quality_pm25
):
air_quality = air_quality.sort_values("date.utc")
air_quality.head()
date.utc | location | parameter | value | |
---|---|---|---|---|
2067 | 2019-05-07 01:00:00+00:00 | London Westminster | no2 | 23.0 |
1003 | 2019-05-07 01:00:00+00:00 | FR04014 | no2 | 25.0 |
100 | 2019-05-07 01:00:00+00:00 | BETR801 | pm25 | 12.5 |
1098 | 2019-05-07 01:00:00+00:00 | BETR801 | no2 | 50.5 |
1109 | 2019-05-07 01:00:00+00:00 | London Westminster | pm25 | 8.0 |
В этом примере столбец parameter
, позволяет идентифицировать каждую из исходных таблиц. Это не всегда так, функция concat
предоставляет удобное решение с аргументом keys
, добавляя дополнительный (иерархический) индекс строки. Например:
air_quality_ = pd.concat([air_quality_pm25, air_quality_no2],
keys=["PM25", "NO2"])
air_quality_.head()
date.utc | location | parameter | value | ||
---|---|---|---|---|---|
PM25 | 0 | 2019-06-18 06:00:00+00:00 | BETR801 | pm25 | 18.0 |
1 | 2019-06-17 08:00:00+00:00 | BETR801 | pm25 | 6.5 | |
2 | 2019-06-17 07:00:00+00:00 | BETR801 | pm25 | 18.5 | |
3 | 2019-06-17 06:00:00+00:00 | BETR801 | pm25 | 16.0 | |
4 | 2019-06-17 05:00:00+00:00 | BETR801 | pm25 | 7.5 |
Существование нескольких индексов строк/столбцов одновременно не упоминалось ранее. Иерархическая индексация или MultiIndex
- это продвинутая и мощная функция pandas
для анализа многомерных данных.
На данный момент помните, что функцию reset_index
можно использовать для преобразования любого уровня индекса в столбец, например,
air_quality.reset_index(level=0)
Не стесняйтесь погрузиться в мир мультииндексирования в разделе руководства пользователя по расширенной индексации.
Дополнительные параметры конкатенации таблиц (с точки зрения строк и столбцов) и того, как concat
можно использовать для определения логики (объединения или пересечения) индексов на других осях, представлены в разделе о конкатенации объектов.
Координаты станции измерения качества воздуха хранятся в файле данных air_quality_stations.csv
.
url = "https://raw.githubusercontent.com/dm-fedorov/pandas_basic/master/%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5%20%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B2%20pandas/data/air_quality_stations.csv"
stations_coord = pd.read_csv(url)
stations_coord.head()
location | coordinates.latitude | coordinates.longitude | |
---|---|---|---|
0 | BELAL01 | 51.23619 | 4.38522 |
1 | BELHB23 | 51.17030 | 4.34100 |
2 | BELLD01 | 51.10998 | 5.00486 |
3 | BELLD02 | 51.12038 | 5.02155 |
4 | BELR833 | 51.32766 | 4.36226 |
Станции, используемые в этом примере (FR04014
, BETR801
и London Westminster
) - это всего лишь три записи в таблице метаданных. Мы хотим добавить координаты этих станций в таблицу измерений, каждая из которых находится в соответствующих строках таблицы air_quality
.
air_quality.head()
date.utc | location | parameter | value | |
---|---|---|---|---|
2067 | 2019-05-07 01:00:00+00:00 | London Westminster | no2 | 23.0 |
1003 | 2019-05-07 01:00:00+00:00 | FR04014 | no2 | 25.0 |
100 | 2019-05-07 01:00:00+00:00 | BETR801 | pm25 | 12.5 |
1098 | 2019-05-07 01:00:00+00:00 | BETR801 | no2 | 50.5 |
1109 | 2019-05-07 01:00:00+00:00 | London Westminster | pm25 | 8.0 |
Добавим координаты станции, предоставленные в таблице метаданных станций, в соответствующие строки таблицы измерений:
air_quality = pd.merge(air_quality, stations_coord,
how='left', on='location')
air_quality.head()
date.utc | location | parameter | value | coordinates.latitude | coordinates.longitude | |
---|---|---|---|---|---|---|
0 | 2019-05-07 01:00:00+00:00 | London Westminster | no2 | 23.0 | 51.49467 | -0.13193 |
1 | 2019-05-07 01:00:00+00:00 | FR04014 | no2 | 25.0 | 48.83724 | 2.39390 |
2 | 2019-05-07 01:00:00+00:00 | FR04014 | no2 | 25.0 | 48.83722 | 2.39390 |
3 | 2019-05-07 01:00:00+00:00 | BETR801 | pm25 | 12.5 | 51.20966 | 4.43182 |
4 | 2019-05-07 01:00:00+00:00 | BETR801 | no2 | 50.5 | 51.20966 | 4.43182 |
Используя функцию merge()
, для каждой строки таблицы air_quality
добавляются соответствующие координаты из таблицы air_quality_stations_coord
. Обе таблицы имеют общий столбец location
, который используется в качестве ключа для объединения информации. Выбрав объединение left
, в результирующей таблице air_quality
окажутся только местоположения, доступные в (левой) таблице, например FR04014
, BETR801
и London Westminster
. В функции merge поддерживает несколько опции, подобных операциям из базы данных.
Добавим описание и имя параметра, предоставленные таблицей метаданных, в таблицу измерений:
Метаданные параметров о качестве воздуха хранятся в файле air_quality_parameters.csv
.
url = "https://raw.githubusercontent.com/dm-fedorov/pandas_basic/master/%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5%20%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B2%20pandas/data/air_quality_parameters.csv"
air_quality_parameters = pd.read_csv(url)
air_quality_parameters.head()
id | description | name | |
---|---|---|---|
0 | bc | Black Carbon | BC |
1 | co | Carbon Monoxide | CO |
2 | no2 | Nitrogen Dioxide | NO2 |
3 | o3 | Ozone | O3 |
4 | pm10 | Particulate matter less than 10 micrometers in... | PM10 |
air_quality = pd.merge(air_quality, air_quality_parameters,
how='left', left_on='parameter', right_on='id')
air_quality.head()
date.utc | location | parameter | value | coordinates.latitude | coordinates.longitude | id | description | name | |
---|---|---|---|---|---|---|---|---|---|
0 | 2019-05-07 01:00:00+00:00 | London Westminster | no2 | 23.0 | 51.49467 | -0.13193 | no2 | Nitrogen Dioxide | NO2 |
1 | 2019-05-07 01:00:00+00:00 | FR04014 | no2 | 25.0 | 48.83724 | 2.39390 | no2 | Nitrogen Dioxide | NO2 |
2 | 2019-05-07 01:00:00+00:00 | FR04014 | no2 | 25.0 | 48.83722 | 2.39390 | no2 | Nitrogen Dioxide | NO2 |
3 | 2019-05-07 01:00:00+00:00 | BETR801 | pm25 | 12.5 | 51.20966 | 4.43182 | pm25 | Particulate matter less than 2.5 micrometers i... | PM2.5 |
4 | 2019-05-07 01:00:00+00:00 | BETR801 | no2 | 50.5 | 51.20966 | 4.43182 | no2 | Nitrogen Dioxide | NO2 |
По сравнению с предыдущим примером нет общего имени столбца. Однако столбец parameter в таблице air_quality
и столбец id
в air_quality_parameters
содержат переменную в общем формате. Аргументы left_on
и right_on
используются, чтобы сделать связь между двумя таблицами.
pandas поддерживают внутренние, внешние и правые соединения. Более подробная информация о join/merge
таблиц представлена в разделе руководства пользователя по объединению таблиц в стиле базы данных. Или взгляните на страницу сравнения с SQL.
См. Руководство пользователя для полного описания различных средств для объединения таблиц данных.
Подписка на онлайн-обучение