import pandas as pd
本教程使用的数据
本教程使用 OpenAQ 提供、通过 py-openaq 包获取的二氧化氮(NO₂)空气质量数据。air_quality_no2.csv 包含巴黎 FR04014、安特卫普 BETR801、伦敦 Westminster 三个监测站的 NO₂ 数值。数据文件位于官方仓库。
air_quality = pd.read_csv("data/air_quality_no2.csv", index_col=0, parse_dates=True)
air_quality.head()
原文输出:
station_antwerp station_paris station_london
datetime
2019-05-07 02:00:00 NaN NaN 23.0
2019-05-07 03:00:00 50.5 25.0 19.0
2019-05-07 04:00:00 45.0 27.7 19.0
2019-05-07 05:00:00 NaN 50.4 16.0
2019-05-07 06:00:00 NaN 61.9 NaN
从已有列派生新列
将伦敦站的 NO₂ 浓度换算为 mg/m³
原文假定温度为25摄氏度、压力为1013 hPa,并给出换算系数1.882:
air_quality["london_mg_per_cubic"] = air_quality["station_london"] * 1.882
air_quality.head()
原文输出:
station_antwerp ... london_mg_per_cubic
datetime ...
2019-05-07 02:00:00 NaN ... 43.286
2019-05-07 03:00:00 50.5 ... 35.758
2019-05-07 04:00:00 45.0 ... 35.758
2019-05-07 05:00:00 NaN ... 30.112
2019-05-07 06:00:00 NaN ... NaN
[5 rows x 4 columns]
创建新列时,将新列名放在方括号 [] 中,并把它写在赋值表达式左侧。
这里的计算逐元素进行,也就是说,给定列中的所有值都会乘以1.882。不必写循环遍历每一行。
计算巴黎与安特卫普的数值比,并保存在新列中
air_quality["ratio_paris_antwerp"] = (
air_quality["station_paris"] / air_quality["station_antwerp"]
)
air_quality.head()
原文输出:
station_antwerp ... ratio_paris_antwerp
datetime ...
2019-05-07 02:00:00 NaN ... NaN
2019-05-07 03:00:00 50.5 ... 0.495050
2019-05-07 04:00:00 45.0 ... 0.615556
2019-05-07 05:00:00 NaN ... NaN
2019-05-07 06:00:00 NaN ... NaN
[5 rows x 5 columns]
这里同样逐元素计算,/ 应用于同一行的两个值。
其他数学运算符(+、-、*、/ 等)与逻辑运算符(<、>、== 等)也逐元素工作。在前面的数据子集教程中,已经通过条件表达式使用逻辑运算符筛选表格行。
如果需要更复杂的逻辑,可以通过 apply() 使用自定义 Python 代码。
将数据列重命名为 OpenAQ 对应的监测站标识符
air_quality_renamed = air_quality.rename(
columns={
"station_antwerp": "BETR801",
"station_paris": "FR04014",
"station_london": "London Westminster",
}
)
air_quality_renamed.head()
原文输出:
BETR801 FR04014 ... london_mg_per_cubic ratio_paris_antwerp
datetime ...
2019-05-07 02:00:00 NaN NaN ... 43.286 NaN
2019-05-07 03:00:00 50.5 25.0 ... 35.758 0.495050
2019-05-07 04:00:00 45.0 27.7 ... 35.758 0.615556
2019-05-07 05:00:00 NaN 50.4 ... 30.112 NaN
2019-05-07 06:00:00 NaN 61.9 ... NaN NaN
[5 rows x 5 columns]
rename() 可用于行标签与列标签。传入字典时,用当前名称作为键,用新名称作为值,即可更新相应名称。
映射不限于固定名称,也可以使用映射函数。例如,通过函数将所有列名转为小写:
air_quality_renamed = air_quality_renamed.rename(columns=str.lower)
air_quality_renamed.head()
原文输出:
betr801 fr04014 ... london_mg_per_cubic ratio_paris_antwerp
datetime ...
2019-05-07 02:00:00 NaN NaN ... 43.286 NaN
2019-05-07 03:00:00 50.5 25.0 ... 35.758 0.495050
2019-05-07 04:00:00 45.0 27.7 ... 35.758 0.615556
2019-05-07 05:00:00 NaN 50.4 ... 30.112 NaN
2019-05-07 06:00:00 NaN 61.9 ... NaN NaN
[5 rows x 5 columns]
行标签与列标签的重命名细节,可查阅用户指南的重命名标签部分。
需要记住的操作
– 将计算结果赋给 DataFrame,并在 [] 内给出新列名,就能创建新列。
– 运算逐元素进行,不必循环遍历每一行。
– 将字典或函数传给 rename,可以重命名行标签或列名。
用户指南还有列的增加与删除的专门说明。
技术核对
原文将单位写为 mg/m³,代码使用1.882。该系数的真实单位依赖输入数据单位,不能仅由这段代码确认。此处保留原文表述和代码,实际处理数据时须先核对 OpenAQ 数据单位;不应仅凭此示例判断物理单位换算的正确性。输出为原文示例。配图为官方原文示意图。
来源与许可
作者:pandas 开发团队与贡献者。原文:How to create new columns derived from existing columns,pandas 3.0.6。本文为中文翻译,去掉交互式提示符以方便复制代码。
pandas 采用 BSD 3-Clause 许可证。Copyright (c) 2008-2011, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team;Copyright (c) 2011-2026, Open source contributors。完整条件与免责声明见 官方LICENSE 。
本文适用于 pandas 3.0.6。












暂无评论内容