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
    

Как объединить данные из нескольких таблиц#

Конкатенация объектов#

../../_images/08_concat_row.svg
  • Я хочу объединить измерения \(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 может использоваться для определения логики (объединение или пересечение) индексов на других осях, предоставлено в разделе о конкатенация объектов.

Объединение таблиц с использованием общего идентификатора#

../../_images/08_merge_left.svg
  • Добавьте координаты станций, предоставленные таблицей метаданных станций, в соответствующие строки таблицы измерений.

    Предупреждение

    Координаты станций измерения качества воздуха хранятся в файле данных 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 общее, что используется в качестве ключа для объединения информации. Выбирая left join, только местоположения, доступные в 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 оба предоставляют измеряемую переменную в общем формате. The left_on и right_on аргументы используются здесь (вместо просто on) для установления связи между двумя таблицами.

К руководству пользователя

pandas также поддерживает внутренние, внешние и правые соединения. Дополнительная информация о соединении/объединении таблиц приведена в разделе руководства пользователя объединение таблиц в стиле баз данных. Или посмотрите на сравнение с SQL страница.

ПОМНИТЕ

  • Несколько таблиц могут быть объединены как по столбцам, так и по строкам с использованием concat функция.

  • Для объединения/соединения таблиц по принципу баз данных используйте merge функция.

К руководству пользователя

Обратитесь к руководству пользователя для полного описания различных инструменты для объединения таблиц данных.