新闻中心
Pandas 合并后在管道中高效创建新列:eval 与 assign 的应用

本文旨在解决Pandas数据处理中,DataFrame合并(`merge`)操作后,如何在管道(`pipe`)中高效、简洁地利用现有列创建新列的问题。我们将探讨直接使用 `assign` 时可能遇到的 `TypeError`,并提供两种专业的解决方案:利用 `DataFrame.eval()` 进行表达式计算,以及结合 `lambda` 函数使用 `DataFrame.assign()`,以优化代码可读性和执行效率。
在数据分析和处理过程中,Pandas DataFrame 的合并(merge)操作是常见的步骤。完成合并后,我们通常需要基于合并后的数据创建新的计算列。为了保持代码的流畅性和可读性,将这些操作串联成一个管道(pipeline)是推荐的做法。然而,在管道中直接使用 assign 或 transform 来创建新列时,如果对列名的引用方式不当,可能会遇到 TypeError。
问题描述
考虑以下两个Pandas DataFrame:
import pandas as pd
solar_part = pd.DataFrame(
{'pool': 1,
'orig': 635.1}, index = [0]
)
solar_aod = pd.DataFrame(
{'pool': [1,1,1,1],
'MoP': [1,2,3,4],
'prin': [113.1, 115.3, 456.6, 234.1]}
)
print("solar_part DataFrame:")
print(solar_part)
print("\nsolar_aod DataFrame:")
print(solar_aod)输出:
PictoGraphic
AI驱动的矢量插图库和插图生成平台
133
查看详情
solar_part DataFrame: pool orig 0 1 635.1 solar_aod DataFrame: pool MoP prin 0 1 1 113.1 1 1 2 115.3 2 1 3 456.6 3 1 4 234.1
我们的目标是将 solar_aod 与 solar_part 基于 pool 列进行左连接,然后在合并后的 DataFrame 中创建一个名为 remn 的新列,其值为 prin / orig。
尝试在管道中直接使用 assign 并引用列名字符串时,可能会遇到如下错误:
# 错误示例
try:
solar_p = (
solar_aod
.merge(solar_part, on = ['pool'], how = 'left')
.assign(remn = ['prin'] / ['orig'])
)
except TypeError as e:
print(f"\n捕获到错误: {e}")输出:
捕获到错误: unsupported operand type(s) for /: 'list' and 'list'
这个错误的原因在于 ['prin'] 和 ['orig'] 被解释为包含字符串的列表,而不是 DataFrame 的 Series 列。Pandas 不支持对两个列表进行除法运算。即使尝试只使用引号(例如 assign(remn = 'prin' / 'orig')),也会因为尝试对两个字符串进行除法运算而引发 TypeError。
解决方案一:使用 DataFrame.eval()
DataFrame.eval() 方法提供了一种高效且简洁的方式来评估字符串表达式,从而创建或修改 DataFrame 中的列。它特别适用于涉及现有列的数值计算,并且在性能上通常优于纯Python循环。在管道中使用 eval() 时,可以直接引用列名作为表达式的一部分。
solar_p_eval = (
solar_aod
.merge(solar_part, on='pool', how='left')
.eval('remn = prin / orig')
)
print("\n使用 eval() 创建新列后的 DataFrame:")
print(solar_p_eval)输出:
使用 eval() 创建新列后的 DataFrame: pool MoP prin orig remn 0 1 1 113.1 635.1 0.178082 1 1 2 115.3 635.1 0.181546 2 1 3 456.6 635.1 0.718942 3 1 4 234.1 635.1 0.368603
优点:
- 简洁性: 表达式直接以字符串形式给出,非常直观。
- 性能: eval() 在底层利用 NumExpr 库进行优化,对于大型 DataFrame 的数值计算通常比纯 Python 更快。
- 可读性: 对于简单的列间运算,eval() 的语法非常清晰。
注意事项:
- eval() 主要用于数值和布尔表达式。如果需要执行更复杂的Python函数调用或逻辑,可能需要结合其他方法。
- 表达式中的列名必须是合并后 DataFrame 中存在的列。
解决方案二:使用 DataFrame.assign() 结合 lambda 函数
DataFrame.assign() 方法是创建新列的强大工具,它允许我们通过传入关键字参数来定义新列。当在管道中使用 assign() 并且新列的计算依赖于前一步操作(例如 merge 之后)生成的 DataFrame 时,可以使用 lambda 函数。lambda 函数的参数会自动接收当前管道中的 DataFrame,从而允许我们以 df['column_name'] 的形式访问列。
solar_p_assign_lambda = (
solar_aod
.merge(solar_part, on='pool', how='left')
.assign(remn=lambda df: df['prin'] / df['orig'])
)
print("\n使用 assign() 结合 lambda 函数创建新列后的 DataFrame:")
print(solar_p_assign_lambda)输出:
使用 assign() 结合 lambda 函数创建新列后的 DataFrame: pool MoP prin orig remn 0 1 1 113.1 635.1 0.178082 1 1 2 115.3 635.1 0.181546 2 1 3 456.6 635.1 0.718942 3 1 4 234.1 635.1 0.368603
优点:
- 灵活性: lambda 函数内部可以执行任何有效的 Python 代码,包括调用外部函数、条件逻辑等,这使得 assign() 在处理复杂逻辑时更为强大。
- 可组合性: assign() 可以一次性创建多个新列,每个新列的计算都可以是独立的 lambda 表达式。
注意事项:
- 对于非常简单的数值表达式,eval() 可能在性能上略优。
- lambda 表达式的语法对于初学者来说可能需要一些适应。
总结与最佳实践
在 Pandas 数据管道中,合并 DataFrame 后创建新列是一个常见需求。为了保持代码的简洁、高效和可读性,我们应避免直接使用字符串列表作为 assign 的值。
- 对于简单的数值或布尔表达式(例如 col1 / col2, col1 > 10),强烈推荐使用 DataFrame.eval()。它的语法简洁,并且在性能上通常表现出色。
- 对于需要更复杂 Python 逻辑、函数调用或多步计算的情况,DataFrame.assign() 结合 lambda 函数是更灵活的选择。它允许你充分利用 Python 的表达能力。
选择哪种方法取决于具体的计算需求和代码风格偏好。在大多数情况下,eval() 提供了极佳的平衡,而 assign 与 lambda 则提供了无与伦比的灵活性。通过掌握这两种方法,你可以在 Pandas 数据处理管道中更加高效和优雅地创建新列。
以上就是Pandas 合并后在管道中高效创建新列:eval 与 assign 的应用的详细内容,更多请关注其它相关文章!
# 也会
# 万江网站优化价格
# 泰安市seo工具
# 茂名网站建设与推广招聘
# 海外社交营销推广
# seo采访视频
# 石楼网站推广答疑解惑
# 番禺网站建设制作开发
# 佛山电子seo软件
# 邯郸网站建设的方式
# 建材推广网站有哪些
# 你可以
# python
# 是一个
# 源代码
# 如何将
# 命令行
# 转换为
# 数据处理
# 布尔
# 道中
# 代码可读性
# python函数
# 工具
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Go语言中动态执行代码字符串的策略与实践
邮政快递包裹最新位置 邮政快递实时追踪入口
React列表渲染与独立状态管理:避免全局状态影响局部更新
Composer如何在生产环境安全地执行composer update
composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?
QQ邮箱官方邮箱登录入口 QQ邮箱网页版快速访问
c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发
qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程
手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议
支付宝如何设置安全保护_支付宝安全设置的全面教程
Tabulator表格日期时间排序问题及自定义解决方案
单射、满射与双射的关系 一文理清所有逻辑
漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站
2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示
一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰
CSS布局:解决全屏元素100%尺寸与外边距导致的页面溢出问题
Lar*el递归关系中排除子孙节点的策略
UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】
J*aScript:在map操作中高效处理空数组
黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】
Python Socket多播通信中指定源IP地址的实践指南
CSS图片焦点样式实现教程:理解与应用tabindex属性
Python类型检查:优化关联可选属性的Mypy推断策略
使用J*aScript检测输入元素是否包含在特定类中
C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法
地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站
痛风发作了怎么办? 快速止痛和后期饮食调理
Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁
ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版
京东单号查询入口_京东快递订单追踪入口
J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程
C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用
学习通在线学习平台 学习通网页版直接进入课程中心
如何使 Jest 模拟函数默认抛出错误以提高测试效率
解决J*aScript中重复选择项的确认对话框显示问题
曝R星经典之作开发图 设计简陋但信息密集!
J*aScript中在Map循环中检测并处理空数组元素
优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践
Win11怎么修改默认浏览器_Windows 11设置Chrome为默认
零跑汽车11月交付量达70327台 实现连续9个月正增长
极兔快递快件信息查询系统 极兔快递官网运单号追踪
怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】
文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】
GemBox Document HTML转PDF垂直文本渲染问题及解决方案
中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】
包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接
网站内容防复制粘贴的实现策略与局限性
机器学习中对数变换预测结果的反向还原
LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别
PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧


2025-11-24
浏览次数:次
返回列表