在Pandas数据处理管道中,当合并两个DataFrame后需要基于现有列计算生成新列时,直接使用assign()或transform()可能因类型错误而失败。本文将介绍两种高效且正确的解决方案:利用DataFrame.eval()进行简洁的字符串表达式求值,以及通过assign()结合lambda函数实现灵活的列计算,从而优化数据处理流程并提升代码可读性。
在Pandas的数据分析工作中,我们经常需要将多个DataFrame合并,并在合并后立即根据现有列执行计算以生成新的数据列。将这些操作封装在链式管道(pipeline)中,可以显著提高代码的可读性和维护性。然而,在尝试通过assign()或transform()方法在管道中创建新列时,初学者可能会遇到TypeError,尤其是在直接引用列名进行数学运算时。
假设我们有两个DataFrame,solar_part和solar_aod,它们通过pool列进行合并:
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]}
)我们的目标是在合并后,基于prin和orig两列计算一个新的列remn(例如,remn = prin / orig)。一个常见的尝试是直接在assign()中使用列名字符串:
# 错误示范 # solar_p = ( # solar_aod # .merge(solar_part, on = ['pool'], how = 'left') # .assign(remn = ['prin'] / ['orig']) # 或 assign(remn = 'prin' / 'orig') # )
这种写法会导致TypeError: unsupported operand type(s) for /: 'list' and 'list'(或'str' and 'str'),因为assign()在默认情况下会将'prin'或['prin']解释为字符串字面量或字符串列表,而不是DataFrame中的列引用。因此,不能直接对这些字面量执行数学运算。
为了在管道中高效且正确地完成这类操作,Pandas提供了几种解决方案。
DataFrame.eval()方法允许我们以字符串形式定义表达式,并在DataFrame的上下文中执行它们。这使得它非常适合在管道中创建新列,特别是当表达式涉及多个现有列的简单数学运算时。
使用eval()的优点在于其简洁性和效率,Pandas会在底层优化这些字符串表达式的计算。
solar_p_eval = (
solar_aod
.merge(solar_part, on='pool', how='left')
.eval('remn = prin / orig')
)
print(solar_p_eval)输出结果:
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()方法直接将字符串'remn = prin / orig'解析为在当前DataFrame上执行的操作,其中prin和orig被正确识别为列名。
虽然eval()在处理简单表达式时非常强大,但assign()方法通过结合lambda函数提供了更大的灵活性,尤其是在需要执行更复杂的逻辑或调用自定义函数时。
当assign()接收一个可调用对象(如lambda函数)作为参数时,它会将当前的DataFrame作为输入传递给这个函数。这样,我们就可以在lambda函数内部安全地引用DataFrame的列。
solar_p_assign_lambda = (
solar_aod
.merge(solar_part, on='pool', how='left')
.assign(remn = lambda df: df['prin'] / df['orig'])
)
print(solar_p_assign_lambda)输
出结果:
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 df: df['prin'] / df['orig']接收合并后的DataFrame df,然后通过df['prin']和df['orig']正确访问到相应的列Series,并执行逐元素的除法运算。
选择方法:
可读性: 管道操作(pipe、链式调用)本身就旨在提高代码的可读性。选择最能清晰表达意图的方法至关重要。对于简单的列计算,eval()通常更直观。
性能: 对于大规模数据,eval()在某些情况下可能会比assign与lambda的组合更快,因为它能够利用numexpr库进行优化。然而,对于大多数常见场景,两者的性能差异可能不明显。
避免直接字符串运算: 记住,在assign()中直接使用字符串字面量进行运算是无效的。必须通过可调用对象(如lambda)来访问DataFrame的列。
在Pandas的数据处理管道中,合并数据后创建新列是一个常见需求。为了避免TypeError并保持代码的简洁性,我们推荐使用DataFrame.eval()进行简单的列间数学运算,或者使用assign()结合lambda函数来处理更复杂的计算逻辑。这两种方法都能优雅地融入Pandas的链式操作,显著提升数据处理代码的效率和可维护性。理解它们的适用场景和工作原理,将帮助你更高效地利用Pandas进行数据分析。
# 代码可读性
# numpy
# pandas
# 运算符
# 比较运算符
# for
# 封装
# 字符串
# Lambda
# 对象
# transform
# 数据分析
# 链式
# 数据处理
# 是在
# 多个
# 并在
# 道中
# 自定义
# 因为它
# 会将
# 建新
相关文章:
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
如何选购建站域名与空间?自助平台全解析
如何解决VPS建站LNMP环境配置常见问题?
如何通过服务器快速搭建网站?完整步骤解析
个人网站制作流程图片大全,个人网站如何注销?
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
建站之星如何修改网站生成路径?
如何用PHP快速搭建高效网站?分步指南
如何在阿里云虚拟主机上快速搭建个人网站?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
建站三合一如何选?哪家性价比更高?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
营销式网站制作方案,销售哪个网站招聘效果最好?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
专业公司网站制作公司,用什么语言做企业网站比较好?
如何快速上传自定义模板至建站之星?
如何规划企业建站流程的关键步骤?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
建站主机如何选?性能与价格怎样平衡?
如何在自有机房高效搭建专业网站?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
专业商城网站制作公司有哪些,pi商城官网是哪个?
如何用5美元大硬盘VPS安全高效搭建个人网站?
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何快速查询域名建站关键信息?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
建站之星免费版是否永久可用?
小型网站制作HTML,*游戏网站怎么搭建?
如何确保FTP站点访问权限与数据传输安全?
建站主机选哪种环境更利于SEO优化?
山东云建站价格为何差异显著?
如何构建满足综合性能需求的优质建站方案?
html制作网站的步骤有哪些,iapp如何添加网页?
平台云上自助建站如何快速打造专业网站?
电商平台网站制作流程,电商网站如何制作?
动图在线制作网站有哪些,滑动动图图集怎么做?
Python如何创建带属性的XML节点
香港服务器租用费用高吗?如何避免常见误区?
如何选择高效稳定的ISP建站解决方案?
济南企业网站制作公司,济南社保单位网上缴费步骤?
如何选择香港主机高效搭建外贸独立站?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
南平网站制作公司,2025年南平市事业单位报名时间?
*请认真填写需求信息,我们会在24小时内与您取得联系。