使用 pandas 从已有列派生新列

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。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容