0

0

使用 pandas eval 调用自定义函数并拼接字符串的正确方法

花韻仙語

花韻仙語

发布时间:2026-02-01 17:56:02

|

744人浏览过

|

来源于php中文网

原创

使用 pandas eval 调用自定义函数并拼接字符串的正确方法

在 pandas `eval()` 中调用用户自定义函数时,需确保函数返回的是与 dataframe 兼容的 series(而非 python 原生 str),才能安全进行向量化字符串拼接;直接使用 `+` 操作符会失败,应改用 `.__add__()` 方法。

pandas 的 eval() 方法支持通过 @ 符号引用外部函数(如 @my_func),但其底层依赖于 pandas 的表达式引擎对 Series 的向量化操作。若自定义函数仅返回 Python 原生 str(例如 str(x) 作用于标量),eval() 会尝试将整个 Series 作为单个参数传入,导致隐式降维或类型不匹配——这正是你观察到 121\n142\n...additional string 这类混合输出的根本原因:数值部分被当作 Series 打印,而字符串字面量被追加到末尾。

✅ 正确做法是:让自定义函数返回一个 pd.Series(类型为 string 或 object),且长度与输入列一致。最简洁的方式是使用 .astype(str):

import pandas as pd

basic_df = pd.DataFrame({
    "A": [1, 2, 3, 4, 5],
    "B": [20, 40, 60, 100, 90],
    "C": ["C1", "C2", "C3", "C4", "C5"],
})

def str_parse(series):
    return series.astype(str)  # ← 返回 str 类型的 Series,非单个字符串

# ✅ 正确:使用 __add__() 实现向量化字符串拼接
result = basic_df.eval("new_col = @str_parse(A + B + 100).__add__('additional string')")
print(result)

输出:

Melodrive
Melodrive

Melodrive -一个AI音乐引擎,根据用户的情绪状态和喜好生成个性化的音乐。

下载
   A    B   C               new_col
0  1   20  C1  121additional string
1  2   40  C2  142additional string
2  3   60  C3  163additional string
3  4  100  C4  204additional string
4  5   90  C5  195additional string

⚠️ 注意事项:

  • ❌ 不要写 @str_parse(...) + "xxx":eval() 中的 + 在字符串上下文中默认触发 pd.Series.__radd__ 或类型推断逻辑,易出错;
  • ✅ 必须用 .__add__('xxx'):显式调用 Series 的向量化字符串拼接方法,保证逐元素执行;
  • ? 若需更灵活的格式化(如前缀/后缀/模板),推荐改用 assign() + map() 或 apply(),语义更清晰、调试更友好;
  • ? 自定义函数中避免副作用(如打印、修改全局变量),eval() 可能多次调用或惰性求值。

总结:pandas.eval() 并非通用 Python 表达式求值器,而是面向向量化计算的 DSL。与其强行适配复杂字符串逻辑,不如在简单算术转换后切换至 assign(new_col=lambda df: ...) 链式调用——兼顾可读性、可维护性与性能。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

71

2025.12.04

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

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

1

2026.01.31

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

503

2023.08.02

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

82

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

96

2025.09.18

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

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

361

2023.08.03

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

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

212

2023.09.04

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

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

1503

2023.10.24

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

30

2026.01.31

热门下载

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

精品课程

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

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.4万人学习

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

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