In [1]: import pandas as pd
-
Данные о качестве воздуха по нитратам
Для этого руководства, данные о качестве воздуха о \(NO_2\) используется, предоставляется OpenAQ и загруженное с помощью py-openaq пакет.
The
К исходным даннымair_quality_no2_long.csvнабор данных предоставляет \(NO_2\) значения для измерительных станций FR04014, BETR801 и Лондон Вестминстер соответственно в Париже, Антверпене и Лондоне.In [2]: air_quality_no2 = pd.read_csv("data/air_quality_no2_long.csv", ...: parse_dates=True) ...: In [3]: air_quality_no2 = air_quality_no2[["date.utc", "location", ...: "parameter", "value"]] ...: In [4]: air_quality_no2.head() Out[4]: 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 пакет.
The
К исходным даннымair_quality_pm25_long.csvнабор данных предоставляет \(PM_{25}\) значения для измерительных станций FR04014, BETR801 и Лондон Вестминстер соответственно в Париже, Антверпене и Лондоне.In [5]: air_quality_pm25 = pd.read_csv("data/air_quality_pm25_long.csv", ...: parse_dates=True) ...: In [6]: air_quality_pm25 = air_quality_pm25[["date.utc", "location", ...: "parameter", "value"]] ...: In [7]: air_quality_pm25.head() Out[7]: 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_{25}\), две таблицы с похожей структурой, в одной таблице.
In [8]: air_quality = pd.concat([air_quality_pm25, air_quality_no2], axis=0) In [9]: air_quality.head() Out[9]: 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
The
concat()Функция выполняет операции конкатенации нескольких таблиц вдоль одной из осей (по строкам или по столбцам).
По умолчанию конкатенация выполняется вдоль оси 0, поэтому результирующая таблица объединяет строки входных таблиц. Проверим размерность исходных и объединённых таблиц для подтверждения операции:
In [10]: print('Shape of the ``air_quality_pm25`` table: ', air_quality_pm25.shape)
Shape of the ``air_quality_pm25`` table: (1110, 4)
In [11]: print('Shape of the ``air_quality_no2`` table: ', air_quality_no2.shape)
Shape of the ``air_quality_no2`` table: (2068, 4)
In [12]: print('Shape of the resulting ``air_quality`` table: ', air_quality.shape)
Shape of the resulting ``air_quality`` table: (3178, 4)
Следовательно, результирующая таблица содержит 3178 = 1110 + 2068 строк.
Примечание
The ось аргумент будет возвращаться в ряде методов pandas, которые могут быть применены вдоль оси. A DataFrame имеет две
соответствующие оси: первая проходит вертикально вниз по строкам
(ось 0), а вторая проходит горизонтально по столбцам (ось 1).
Большинство операций, таких как конкатенация или сводная статистика, по умолчанию
выполняются по строкам (ось 0), но могут применяться и по столбцам.
Сортировка таблицы по информации о дате и времени также иллюстрирует
комбинацию обеих таблиц, с parameter столбец, определяющий
происхождение таблицы (либо no2 из таблицы air_quality_no2 или
pm25 из таблицы air_quality_pm25):
In [13]: air_quality = air_quality.sort_values("date.utc")
In [14]: air_quality.head()
Out[14]:
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 аргумент, добавляя дополнительный (иерархический) индекс строк. Например:
In [15]: air_quality_ = pd.concat([air_quality_pm25, air_quality_no2], keys=["PM25", "NO2"])
In [16]: air_quality_.head()
Out[16]:
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 для анализа данных более высокой размерности.
Мультииндексирование выходит за рамки этого введения в pandas. На данный момент помните, что функция reset_index может использоваться для преобразования любого уровня индекса в столбец, например
air_quality.reset_index(level=0)
Не стесняйтесь погрузиться в мир мультииндексирования в разделе руководства пользователя расширенная индексация.
Дополнительные возможности по объединению таблиц (по строкам и столбцам) и как concat может использоваться для определения логики (объединение или
пересечение) индексов на других осях, предоставлено в разделе о
конкатенация объектов.
Объединение таблиц с использованием общего идентификатора#
Добавьте координаты станций, предоставленные таблицей метаданных станций, в соответствующие строки таблицы измерений.
Предупреждение
Координаты станций измерения качества воздуха хранятся в файле данных
air_quality_stations.csv, загруженные с использованием py-openaq пакет.In [17]: stations_coord = pd.read_csv("data/air_quality_stations.csv") In [18]: stations_coord.head() Out[18]: 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таблица.In [19]: air_quality.head() Out[19]: 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
In [20]: air_quality = pd.merge(air_quality, stations_coord, how="left", on="location") In [21]: air_quality.head() Out[21]: date.utc ... coordinates.longitude 0 2019-05-07 01:00:00+00:00 ... -0.13193 1 2019-05-07 01:00:00+00:00 ... 2.39390 2 2019-05-07 01:00:00+00:00 ... 2.39390 3 2019-05-07 01:00:00+00:00 ... 4.43182 4 2019-05-07 01:00:00+00:00 ... 4.43182 [5 rows x 6 columns]
Используя
merge()функция, для каждой из строк вair_qualityтаблице, соответствующие координаты добавляются изair_quality_stations_coordтаблица. Обе таблицы имеют столбецlocationобщее, что используется в качестве ключа для объединения информации. Выбираяleftjoin, только местоположения, доступные вair_quality(левой) таблицы, т.е. FR04014, BETR801 и London Westminster, попадают в результирующую таблицу. Методmergeфункция поддерживает несколько вариантов объединения, аналогичных операциям в стиле баз данных.
Добавьте полное описание и имя параметров, предоставленные таблицей метаданных параметров, в таблицу измерений.
Предупреждение
Метаданные параметров качества воздуха хранятся в файле данных
air_quality_parameters.csv, загруженные с использованием py-openaq пакет.In [22]: air_quality_parameters = pd.read_csv("data/air_quality_parameters.csv") In [23]: air_quality_parameters.head() Out[23]: 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
In [24]: air_quality = pd.merge(air_quality, air_quality_parameters, ....: how='left', left_on='parameter', right_on='id') ....: In [25]: air_quality.head() Out[25]: date.utc ... name 0 2019-05-07 01:00:00+00:00 ... NO2 1 2019-05-07 01:00:00+00:00 ... NO2 2 2019-05-07 01:00:00+00:00 ... NO2 3 2019-05-07 01:00:00+00:00 ... PM2.5 4 2019-05-07 01:00:00+00:00 ... NO2 [5 rows x 9 columns]
По сравнению с предыдущим примером, нет общего имени столбца. Однако,
parameterстолбец вair_qualityтаблица иidстолбец вair_quality_parameters_nameоба предоставляют измеряемую переменную в общем формате. Theleft_onиright_onаргументы используются здесь (вместо простоon) для установления связи между двумя таблицами.
pandas также поддерживает внутренние, внешние и правые соединения. Дополнительная информация о соединении/объединении таблиц приведена в разделе руководства пользователя объединение таблиц в стиле баз данных. Или посмотрите на сравнение с SQL страница.
ПОМНИТЕ
Несколько таблиц могут быть объединены как по столбцам, так и по строкам с использованием
concatфункция.Для объединения/соединения таблиц по принципу баз данных используйте
mergeфункция.
Обратитесь к руководству пользователя для полного описания различных инструменты для объединения таблиц данных.