如何合并多个表中的数据
导包
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】连接对象
我想结合测量值 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】使用通用标识符联接表
将台站元数据表提供的台站坐标添加到测量表中的相应行中。
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