In [1]: import pandas as pd 本教程使用的数据: 空气质量硝酸盐数据 在本教程中,空气质量数据有关\(NO_2\)使用,由OpenAQ提供 并使用 py-openaq包下载。 数据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包下载。 数据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 该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参数将在许多可沿 axis应用的 pandas 方法中返回。 ADataFrame有两个相应的轴:第一个轴垂直向下穿过行(轴 0),第二个轴水平穿过列(轴 1)。默认情况下,大多数操作(如串联或汇总统计)是跨行(轴 0)的,但也可以跨列应用。 根据日期时间信息对表进行排序还说明了两个表的组合,其中parameter定义表来源的列(no2来自 tableair_quality_no2或 pm25from table 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用于定义其他轴上索引的逻辑(并集或交集)的更多选项在 对象串联部分提供。 使用通用标识符连接表# 将站点元数据表提供的站点坐标添加到测量表中的相应行。 警告 空气质量测量站坐标存储在数据文件中,使用py-openaqair_quality_stations.csv包下载 。 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 和伦敦威斯敏斯特)只是元数据表中列出的三个条目。我们只想将这三个坐标添加到测量表中,每个坐标都位于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联接,只有(左)表中可用的位置air_quality(即 FR04014、BETR801 和伦敦威斯敏斯特)最终出现在结果表中。该merge函数支持类似于数据库式操作的多个连接选项。 将参数元数据表提供的参数的完整描述和名称添加到测量表中。 警告 空气质量参数元数据存储在数据文件中 ,使用py-openaqair_quality_parameters.csv包下载 。 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以通用格式提供测量变量。此处使用left_on和参数right_on (而不仅仅是on)来建立两个表之间的链接。 转至用户指南pandas 还支持内连接、外连接和右连接。关于表的连接/合并的更多信息在有关数据库样式表合并的用户指南部分中提供 。或者看看 与 SQL 的比较页面。 记住 可以使用该函数按列和按行连接多个表concat。 对于类似数据库的表合并/连接,请使用该merge 函数。 转至用户指南有关组合数据表的各种工具的完整说明,请参阅用户指南。