In [1]: import pandas as pd
-
Air quality Nitrate data
在本教程中,空气质量数据关于 \(NO_2\) 由以下人员使用、提供 OpenAQ 并使用 py-openaq 包裹。
这个
To raw dataair_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
-
Air quality Particulate matter data
在本教程中,使用的是有关小于2.5微米的颗粒物的空气质量数据,由 OpenAQ 并使用 py-openaq 包裹。
这个
To raw dataair_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
这个
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行。
备注
这个 axis 参数将在许多可应用的PANA方法中返回 沿着一条轴 。一个 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)
您可以在上的用户指南部分自由探索多索引的世界 advanced indexing 。
有关表连接(按行和列)以及如何连接的更多选项 concat
可用于定义其他轴上的索引的逻辑(并集或交集)在上的部分提供 object concatenation 。
使用公共标识符联接表#
将桩号元数据表提供的桩号坐标添加到测量表中的相应行。
警告
空气质量测量站坐标存储在数据文件中
air_quality_stations.csv
, downloaded using the 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 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和伦敦威斯敏斯特,最终出现在结果表中。这个merge
函数支持类似于数据库式操作的多个联接选项。
将参数元数据表提供的参数的完整描述和名称添加到测量表中。
警告
空气质量参数元数据存储在数据文件中
air_quality_parameters.csv
, downloaded using the 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 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_name
两者都以一种通用格式提供测量变量。这个left_on
和right_on
此处使用的是参数(而不是on
)在两个表之间建立链接。
Pandas也支持内、外和右连接。上的用户指南部分提供了有关表的联接/合并的更多信息 database style merging of tables 。或者看一看 comparison with SQL 佩奇。
REMEMBER
属性可以按列和按行连接多个表。
concat
功能。对于类似于数据库的表合并/联接,请使用
merge
功能。
请参阅用户指南,了解各种 facilities to combine data tables 。