0

0

Pandas管道操作中合并后高效创建新列的方法

心靈之曲

心靈之曲

发布时间:2025-11-25 14:25:14

|

177人浏览过

|

来源于php中文网

原创

Pandas管道操作中合并后高效创建新列的方法

在pandas数据处理管道中,合并(merge)操作后如何高效且简洁地利用现有列创建新列是一个常见需求。本文将深入探讨在管道中执行此类计算的正确方法,重点介绍`dataframe.eval()`方法,并解释为什么直接使用`assign()`或`transform()`可能导致类型错误,提供清晰的实现范例,以优化数据处理流程。

在数据分析和处理中,我们经常需要将多个数据集合并,然后在合并后的结果上进行进一步的计算,生成新的特征列。Pandas的管道式操作(.pipe()或链式方法调用)能够使代码更加简洁和可读。然而,在管道中合并数据后尝试使用assign()或transform()创建新列时,可能会遇到一些类型错误,尤其是在直接引用列名进行运算时。

初始数据准备

首先,我们创建两个示例DataFrame,solar_part和solar_aod,它们将通过pool列进行合并。

import pandas as pd

# 第一个DataFrame
solar_part = pd.DataFrame(
     {'pool': 1,
     'orig': 635.1}, index = [0]
     )

# 第二个DataFrame
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)

合并后的计算挑战

我们的目标是在合并solar_aod和solar_part后,创建一个名为remn的新列,其值为prin列除以orig列的结果。

尝试直接在assign()中使用列表引用列名进行计算,例如 assign(remn = ['prin'] / ['orig']),会导致 TypeError: unsupported operand type(s) for /: 'list' and 'list'。这是因为 ['prin'] 和 ['orig'] 被解释为包含字符串的列表,而不是DataFrame的Series列。即使尝试使用字符串引用(例如 'prin' / 'orig'),也会因为字符串不支持除法操作而产生类似的错误。

# 错误的尝试:直接在assign中使用列表引用
try:
    solar_p_error = (
        solar_aod
        .merge(solar_part, on = ['pool'], how = 'left')
        .assign(remn = ['prin'] / ['orig'])
    )
except TypeError as e:
    print(f"\n捕获到错误:{e}")

解决方案:使用 DataFrame.eval()

为了在管道中优雅且高效地完成合并后的列计算,DataFrame.eval()方法是一个非常强大的工具。它允许我们使用字符串表达式来创建或修改列,Pandas会在DataFrame的上下文中解析这些表达式。

eval()的优势在于:

  1. 简洁性: 可以直接用字符串形式表达复杂的列间运算。
  2. 性能: 对于大型DataFrame,eval()在某些情况下比纯Python循环或NumPy操作更高效,因为它在C层面进行计算。
  3. 可读性: 表达式直接反映了计算逻辑。

以下是使用eval()在合并后创建新列的正确方法:

聚好用AI
聚好用AI

可免费AI绘图、AI音乐、AI视频创作,聚集全球顶级AI,一站式创意平台

下载
# 正确的解决方案:使用 eval()
solar_p_correct = (
    solar_aod
    .merge(solar_part, on='pool', how='left')
    .eval('remn = prin / orig')
)

print("\n使用 eval() 创建新列后的 DataFrame:")
print(solar_p_correct)

输出结果:

   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

在这个示例中,'remn = prin / orig' 是一个字符串表达式,eval()会识别 prin 和 orig 为DataFrame中的列,并执行相应的除法运算,将结果赋值给新列 remn。

替代方案:assign() 结合 lambda 函数

虽然 eval() 在此场景下表现出色,但 assign() 也可以通过结合 lambda 函数来完成任务。lambda 函数允许您传入DataFrame本身作为参数,从而正确地引用其列。

# 替代方案:使用 assign() 结合 lambda 函数
solar_p_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_lambda)

这种方法同样有效,但对于简单的算术表达式,eval() 的字符串语法通常更简洁直观。assign() 结合 lambda 在需要更复杂逻辑(例如条件判断、调用外部函数)时更为灵活。

注意事项与最佳实践

  • 选择合适的工具: 对于基于现有列的简单算术或比较操作,DataFrame.eval() 是管道中创建新列的理想选择。它提供简洁的语法和潜在的性能优势。
  • 理解 assign() 的工作方式: assign() 期望接收Series或可调用对象(如 lambda 函数),而不是直接的字符串列名或列表。当使用 lambda 时,lambda 函数会接收当前DataFrame作为参数,从而可以正确地访问列。
  • 可读性优先: 在选择方法时,始终考虑代码的可读性和维护性。对于复杂的、涉及多列的计算,eval() 的字符串表达式可能比嵌套的 lambda 表达式更易读。
  • 避免混合引用: 在 eval() 表达式中,列名可以直接使用,但如果要引入外部变量,需要使用 @ 符号,例如 eval('remn = prin / @my_variable')。

总结

在Pandas的数据处理管道中,合并操作后高效地创建新列是常见需求。通过本文的探讨,我们了解到DataFrame.eval()方法是处理这类任务的强大且简洁的工具,它允许我们直接使用字符串表达式进行列间计算,避免了assign()在直接引用列名时可能导致的TypeError。同时,我们也介绍了assign()结合lambda函数的替代方案,适用于更复杂的逻辑。掌握这些技巧,将有助于您编写更清晰、更高效的Pandas数据处理代码。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

81

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

34

2026.01.31

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

651

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1228

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1205

2024.04.29

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号