如何在pandas eval中使用自定义函数并实现字符串拼接?
在pandas eval中实现自定义函数返回值与静态字符串的拼接
问题重现
简单场景下,pandas eval 可正常调用自定义函数:
import pandas as pd from pandas import DataFrame basic_df = DataFrame({"A":[1,2,3,4,5],"B":[20,40,60,100,90], "C":["C1","C2","C3","C4","C5"], }) def str_parse(element) -> str: return str(element) print(basic_df.eval("@str_parse(A+B+100)"))
输出符合预期:
0 121 1 142 2 163 3 204 4 195 dtype: object
但直接拼接静态字符串时,结果异常:
print(basic_df.eval("@str_parse(A+B+100) + \"additional string\""))
错误输出:
0 121 1 142 2 163 3 204 4 195 dtype: int64additional string.
原因是pandas Series与字符串直接拼接时,会把字符串追加到整个Series的输出末尾,而非每个元素单独拼接。
解决方案(无需新增列)
方法1:在自定义函数内部完成拼接
修改函数支持传入后缀参数,在eval中直接调用:
def str_parse(element, suffix="") -> str: return str(element) + suffix print(basic_df.eval("@str_parse(A+B+100, suffix='additional string')"))
正确输出:
0 121additional string 1 142additional string 2 163additional string 3 204additional string 4 195additional string dtype: object
方法2:在eval中使用字符串格式化语法
无需自定义函数,直接用f-string语法完成拼接:
print(basic_df.eval("f'{A+B+100}additional string'"))
输出与方法1一致。
方法3:结合pandas字符串方法
通过astype(str)转换数值后再拼接:
print(basic_df.eval("(A+B+100).astype(str) + 'additional string'"))
同样实现每个元素单独拼接的效果。
内容的提问来源于stack exchange,提问作者Konstanty Maciej Lachowicz
相关产品推荐
相关产品推荐

