如何合并多个表中的数据

【Pandas入门教程】如何合并多个表中的数据-LMLPHP

导包

import pandas as pd

数据准备

【空气质量硝酸盐数据】

air_quality_no2_long.csv N O 2 NO_2 NO2 分别位于巴黎、安特卫普和伦敦的 FR04014、BETR801 和伦敦威斯敏斯特测量站的值。

air_quality_no2 = pd.read_csv("air_quality_no2_long.csv", parse_dates=True)
air_quality_no2 = air_quality_no2[["date.utc", "location", "parameter", "value"]]
air_quality_no2.head()

【空气质量颗粒物数据】

air_quality_pm25_long.csv P M 2.5 PM_{2.5} PM2.5 分别位于巴黎、安特卫普和伦敦的 FR04014、BETR801 和伦敦威斯敏斯特测量站的值。

air_quality_pm25 = pd.read_csv("air_quality_pm25_long.csv")
air_quality_pm25 = air_quality_pm25[["date.utc", "location", "parameter", "value"]]
air_quality_pm25.head()

【1】连接对象

【Pandas入门教程】如何合并多个表中的数据-LMLPHP

我想结合测量值 N O 2 NO_2 NO2 P M 2.5 PM_{2.5} PM2.5 ,两个结构相似的表,位于一个表中。

air_quality = pd.concat([air_quality_pm25, air_quality_no2], axis=0)
air_quality.head()

concat() 函数沿其中一个轴(逐行或按列)对多个表执行串联操作。

默认情况下,串联沿轴 0 进行,因此生成的表合并了输入表的行。让我们检查原始表和串联表的形状以验证操作:

print('Shape of the ``air_quality_pm25`` table: ', air_quality_pm25.shape)
Shape of the ``air_quality_pm25`` table:  (1110, 4)
print('Shape of the ``air_quality_no2`` table: ', air_quality_no2.shape)
Shape of the ``air_quality_no2`` table:  (2068, 4)
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列定义表的原点(表 air_quality_no2 中的 no2 或表 air_quality_pm25 中的 pm25):

air_quality = air_quality.sort_values("date.utc")
air_quality.head()

在此特定示例中,数据提供的parameter列可确保可以标识每个原始表。情况并非总是如此。concat 函数使用 keys 参数提供了一个方便的解决方案,添加了额外的(分层)行索引。例如:

air_quality_ = pd.concat([air_quality_pm25, air_quality_no2], keys=["PM25", "NO2"])
air_quality_.head()

【2】使用通用标识符联接表

【Pandas入门教程】如何合并多个表中的数据-LMLPHP

将台站元数据表提供的台站坐标添加到测量表中的相应行中。

stations_coord = pd.read_csv("air_quality_stations.csv")
stations_coord.head()

此示例中使用的电台(FR04014、BETR801 和伦敦威斯敏斯特)只是元数据表中登记的三个条目。我们只想将这三个坐标添加到测量表中,每个坐标都在air_quality表的相应行上。

air_quality.head()
air_quality = pd.merge(air_quality, stations_coord, how="left", on="location")
air_quality.head()

使用 merge() 函数,对于air_quality表中的每一行,将从air_quality_stations_coord表中添加相应的坐标。两个表具有共同的列位置,该location用作组合信息的键。通过选择left连接,只有air_quality(左)表中可用的位置,即FR04014,BETR801和伦敦威斯敏斯特,最终会出现在结果表中。merge函数支持多个联接选项,类似于数据库样式的操作。

将参数元数据表提供的参数的完整描述和名称添加到测量表中。

air_quality_parameters = pd.read_csv("air_quality_parameters.csv")
air_quality_parameters.head()
air_quality = pd.merge(air_quality, air_quality_parameters, how="left", left_on="parameter", right_on="id")
air_quality.head()

与前面的示例相比,没有通用列名。但是,air_quality表中的parameter列和air_quality_parameters_name中的 id 列都以通用格式提供测量变量。left_on 和 right_on 参数(而不仅仅是 on)在两个表之间建立链接。

【小结】

可以使用 concat 函数按列和按行连接多个表。

对于类似数据库的表合并/连接,请使用merge

12-25 06:36