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

如何合并多个表中的数据

来源:Pandas官网:https://pandas.pydata.org/docs/getting_started/intro_tutorials/index.html
笔记托管:https://gitee.com/DingJiaxiong/machine-learning-study

【Pandas入门教程】如何合并多个表中的数据_第1张图片

文章目录

    • 如何合并多个表中的数据
        • 导包
        • 数据准备
        • 【1】连接对象
        • 【2】使用通用标识符联接表
        • 【小结】

导包

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()
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_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()
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

【1】连接对象

【Pandas入门教程】如何合并多个表中的数据_第2张图片

我想结合测量值 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()
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 进行,因此生成的表合并了输入表的行。让我们检查原始表和串联表的形状以验证操作:

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()
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 参数提供了一个方便的解决方案,添加了额外的(分层)行索引。例如:

air_quality_ = pd.concat([air_quality_pm25, air_quality_no2], keys=["PM25", "NO2"])
air_quality_.head()
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

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

【Pandas入门教程】如何合并多个表中的数据_第3张图片

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

stations_coord = pd.read_csv("air_quality_stations.csv")
stations_coord.head()
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表的相应行上。

air_quality.head()
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
air_quality = pd.merge(air_quality, stations_coord, how="left", on="location")
air_quality.head()
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 = pd.read_csv("air_quality_parameters.csv")
air_quality_parameters.head()
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
air_quality = pd.merge(air_quality, air_quality_parameters, how="left", left_on="parameter", right_on="id")
air_quality.head()
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

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

【小结】

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

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

你可能感兴趣的:(非零基础自学数据分析,pandas,python,数据分析)