ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

pandas 入门教程(五):如何基于现有列创建新列——从元素级运算到重命名实战

2026/9/19 4:17:25 拓冰建站 浏览量
pandas 入门教程(五):如何基于现有列创建新列——从元素级运算到重命名实战 pandas 入门教程五如何基于现有列创建新列——从元素级运算到重命名实战【免费下载链接】pandasFlexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more项目地址: https://gitcode.com/gh_mirrors/pa/pandas本教程是 pandas 官方10 minutes to pandas入门系列的第 5 篇围绕从已有列创建新列这一核心主题展开。你将学会使用方括号赋值创建派生列、理解 pandas 元素级element-wise运算机制、利用rename重命名行/列标签并掌握assign、insert、pop等进阶列操作方法。全文基于当前仓库 doc/source/getting_started/intro_tutorials/05_add_columns.rst 编写所有示例均可直接复制运行。教程数据准备本教程使用空气质量数据NO₂浓度该数据由 OpenAQ 提供原始数据文件位于 doc/data/air_quality_no2.csv。数据包含三个监测站的小时级NO₂值巴黎的FR04014、安特卫普的BETR801和伦敦的London Westminster对应教程中的station_paris、station_antwerp、station_london三列第一列datetime为时间索引。import pandas as pd air_quality pd.read_csv(doc/data/air_quality_no2.csv, index_col0, parse_datesTrue) 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可以看到数据中存在NaN缺失值例如伦敦站 2019-05-07 06:00:00 无记录。缺失值在后续运算中会被传播NaN参与运算结果仍为NaN这与 pandas 缺失值语义一致。提示如果你在仓库根目录下运行本教程代码请将数据路径改为doc/data/air_quality_no2.csv若按教程惯例将工作目录设为doc则使用data/air_quality_no2.csv即可。本仓库中该 CSV 文件位于 doc/data/air_quality_no2.csv。用方括号赋值创建新列任务一将伦敦站的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 station_paris station_london london_mg_per_cubic datetime 2019-05-07 02:00:00 NaN NaN 23.0 43.286 2019-05-07 03:00:00 50.5 25.0 19.0 35.758 2019-05-07 04:00:00 45.0 27.7 19.0 35.758 2019-05-07 05:00:00 NaN 50.4 16.0 30.112 2019-05-07 06:00:00 NaN 61.9 NaN NaN关键机制元素级element-wise运算创建新列的语法要点是新列名放在方括号内位于赋值符号左侧。air_quality[station_london] * 1.882中标量1.882会与该列一个Series的每个元素逐一相乘即元素级运算——所有值一次性完成计算无需编写循环逐行迭代。这正是 pandas 向量化编程的核心优势之一。从源码层面看DataFrame.__setitem__见 pandas/core/frame.py负责将右侧的Series或数组按索引对齐后写入新列。当右侧是标量或长度不足的Series时pandas 会自动广播broadcast或按索引对齐填充。列与列之间的元素级运算任务二计算巴黎与安特卫普站值的比率并保存为新列。air_quality[ratio_paris_antwerp] ( air_quality[station_paris] / air_quality[station_antwerp] ) air_quality.head()输出station_antwerp station_paris station_london london_mg_per_cubic ratio_paris_antwerp datetime 2019-05-07 02:00:00 NaN NaN 23.0 43.286 NaN 2019-05-07 03:00:00 50.5 25.0 19.0 35.758 0.495050 2019-05-07 04:00:00 45.0 27.7 19.0 35.758 0.615556 2019-05-07 05:00:00 NaN 50.4 16.0 30.112 NaN 2019-05-07 06:00:00 NaN 61.9 NaN NaN NaN这里的/同样是**逐行元素级**应用的每一行的巴黎值除以同一行的安特卫普值。NaN参与运算的结果为NaN所以巴黎或安特卫普任一缺失时比率都是缺失值。其他可用的运算符数学运算符、-、*、/等均按元素逐行作用逻辑运算符、、等同样元素级生效。此前在数据子集教程03_subset_data.rst中就是用条件表达式筛选行例如air_quality[station_london] 20会返回一个布尔Series可用于布尔索引。例如# 生成一个布尔列标记伦敦站 NO₂ 是否超过 20 µg/m³ air_quality[london_above_20] air_quality[station_london] 20更复杂的逻辑apply如果需要更高级的自定义逻辑可以使用DataFrame.apply传入任意 Python 代码air_quality[london_mg_per_cubic_apply] air_quality.apply( lambda row: row[station_london] * 1.882, axis1 )apply(axis1)会逐行调用传入的函数此处用 lambda 接收每一行适合无法用简单运算符表达的行内逻辑。需要注意apply走 Python 层循环性能低于原生向量化运算符在数据量较大时应优先使用向量化写法。apply的实现位于 pandas/core/frame.py。使用 rename 重命名行列标签任务三把数据列重命名为 OpenAQ 使用的站点标识符。air_quality_renamed air_quality.rename( columns{ station_antwerp: BETR801, station_paris: FR04014, station_london: London Westminster, } ) air_quality_renamed.head()DataFrame.rename源码见 pandas/core/frame.py既可以重命名行标签也可以重命名列标签方式是传入一个字典键是旧名称值是新名称。未被字典覆盖的标签保持不变多余的键也不会报错。映射不仅可以是固定名称还可以是函数。例如用函数把所有列名转为小写air_quality_renamed air_quality_renamed.rename(columnsstr.lower) air_quality_renamed.head()输出前几列betr801 fr04014 london westminster london_mg_per_cubic ratio_paris_antwerp datetime 2019-05-07 02:00:00 NaN NaN 23.0 43.286 NaN 2019-05-07 03:00:00 50.5 25.0 19.0 35.758 0.495050 ...str.lower会作为映射函数作用到每个列名上。关于行列标签重命名的更多细节可参阅用户指南 doc/source/user_guide/basics.rst 中 Renaming / mapping labels 一节对应basics.rename锚点。rename 的完整参数说明从源码签名可见DataFrame.rename支持以下参数参数类型说明mapperdict-like 或 function应用到指定轴的映射需配合axis使用indexdict-like 或 function等价于mapper, axis0重命名行标签columnsdict-like 或 function等价于mapper, axis1重命名列标签axis{0/index, 1/columns}默认 0mapper作用的目标轴inplacebool默认 False是否原地修改 DataFramepandas 3.1 起已弃用建议使用返回值levelint 或 level 名称MultiIndex 场景下只重命名指定层级errors{ignore,raise}默认ignoreraise时若映射含不存在的标签会抛KeyErroraxis 风格调用示例与columns/index等价air_quality.rename({station_paris: FR04014}, axiscolumns)此外Series.rename还可接受标量或列表来修改Series.name属性rename_axis则用于修改轴名称MultiIndex 场景详见 pandas/core/frame.py 处的重载与文档字符串。进阶更多列操作方法原教程之外用户指南中Column selection, addition, deletion一节见 doc/source/user_guide/dsintro.rst还系统介绍了其他列操作方式与本文主题直接相关一并补充如下。布尔列与常量列air_quality[flag] air_quality[station_paris] 50 # 布尔列 air_quality[unit] µg/m³ # 标量广播填充整列插入标量时该值会自动广播填充到整个新列。删除与弹出列del air_quality[flag] # 就地删除列 unit air_quality.pop(unit) # 删除并返回该列Seriespop的源码见 pandas/core/frame.py它像字典的pop一样同时完成删除与取值。insert在指定位置插入列默认情况下新列追加在末尾DataFrame.insert可在任意位置插入见 pandas/core/frame.pyair_quality.insert(1, paris_mg_per_cubic, air_quality[station_paris] * 1.882)第一个参数是插入位置的列序号此处为 1即第二列第二个参数是新列名第三个参数是值Series、数组或标量。注意插入原始 NumPy 数组时其长度必须与 DataFrame 的行数一致。assign链式操作中创建新列DataFrame.assign见 pandas/core/frame.py借鉴了 dplyr 的mutate语义专为**方法链method chaining**设计始终返回原数据的副本不会修改原 DataFrame。它支持直接传入计算好的值也支持传入接收 DataFrame 并返回新列的函数# 方式一传入预计算值 air_quality.assign(paris_ratiolambda df: df[station_paris] / df[station_london]) # 方式二lambda 延迟求值函数在调用链中的当前 DataFrame 上执行 ( air_quality.query(station_london.notna()) .assign(london_mglambda df: df[station_london] * 1.882) .head() )assign的关键特性**kwargs的键是新列名值可以是值Series/数组或一元函数返回副本原 DataFrame 不被修改关键字参数顺序被保留因此后面的表达式可以引用前面刚创建的列实现依赖赋值df.assign(adf[x] * 2, blambda df: df[a] 1)pandas 3.x 中还可使用pd.col(col_name)表达式例如df.assign(sepal_ratiopd.col(SepalWidth) / pd.col(SepalLength))。这种写法在先筛选、再派生列、再绘图的长链式操作中特别有用因为你不必持有中间结果的引用。要点回顾创建新列用df[新列名] 表达式将表达式结果赋给方括号内新列名的左侧元素级运算、-、*、/、、、等运算符逐元素/逐行生效无需循环重命名用rename配合字典旧名→新名或函数如str.lower重命名行标签或列名进阶工具assign链式、返回副本、insert指定位置插入、pop/del删除列、标量广播填充等缺失值传播NaN参与任何运算都会导致结果缺失这是设计行为而非 bug。下一步可继续学习本系列后续教程如分组统计06_calculate_statistics.rst与数据合并08_combine_dataframes.rst。本教程的配套用户指南章节见 doc/source/user_guide/basics.rst 与 doc/source/user_guide/dsintro.rst。【免费下载链接】pandasFlexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more项目地址: https://gitcode.com/gh_mirrors/pa/pandas创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考