In [1]: import pandas as pd
-
空气质量硝酸盐数据
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
-
空气质量颗粒物数据
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 参数将在许多 pandas 方法中出现,这些方法可以沿轴应用。一个 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
列,该列用作合并信息的键。通过选择left
连接,只有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]
与之前的示例相比,这里没有共同的列名。但是,
air_quality
表格中的parameter
列和air_quality_parameters_name
表格中的id
列都以通用格式提供了测量变量。这里使用left_on
和right_on
参数(而不是只使用on
)来建立两个表格之间的关联。
pandas 还支持内连接 (inner)、外连接 (outer) 和右连接 (right)。有关表格连接/合并的更多信息,请参见用户指南中关于 数据库风格的表格合并 的部分。或者查阅 与 SQL 的比较 页面。
记住
可以使用
concat
函数按列或按行连接多个表格。对于类似数据库的表格合并/连接,请使用
merge
函数。
有关各种 数据表格组合功能 的完整描述,请参见用户指南。