来源:Pandas官网:https://pandas.pydata.org/docs/getting_started/intro_tutorials/index.html
笔记托管:https://gitee.com/DingJiaxiong/machine-learning-study
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 |
我想结合测量值 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 |
将台站元数据表提供的台站坐标添加到测量表中的相应行中。
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