Pandas eval() 嵌套自定义函数与算术运算符和 pandas 包装器具有不同的行为

问题描述 投票:0回答:2

简介:

我尝试使用带有

pandas.eval()
的“嵌套”自定义函数,但我得到了一些带有算术运算符的
AttributeError
,请参阅最后的问题。

我使用

Dataframe.mul()
*
得到相同的结果,其中两个结果的类型都是
pandas.core.series.Series
:

import pandas as pd


_test = pd.DataFrame({'col1': [1, 2]})

_result_1 = _test["col1"] * 2  # type(_result_1) = <class 'pandas.core.series.Series'>

_result_2 = _test["col1"].mul(2)  # type(_result_2) = <class 'pandas.core.series.Series'>

我可以使用算术运算符:

_test["new_col_1"] = _test.eval("col1 * 2")

可以使用自定义功能:

def cumsum_function_test(input_series):
    return input_series.cumsum()

_test["new_col_4"] = _test.eval("@cumsum_function_test(col1)")

可以内联或使用自定义函数使用 pandas 包装运算符(例如

Dataframe.mul()
):

def cumsum_function_test(input_series):
    return input_series.cumsum()

_test["new_col_2"] = _test.eval("col1.mul(2).cumsum()")

_test["new_col_5"] = _test.eval("@cumsum_function_test(col1.mul(2))")

问题:

但是在这种情况下我得到了

AttributeError

_test["new_col_6"] = _test.eval("@cumsum_function_test(col1 * 2)") # => AttributeError: 'BinOp' object has no attribute 'value'

如何处理方程

col1 * 2
以便在自定义函数中使用它?

结果:

enter image description here

python python-3.x pandas dataframe
2个回答
1
投票

我也有同样的问题。我解决了间接方法。当自定义函数输入具有算术表达式时,会出现此问题。但是自定义函数可以获取另一个函数作为输入。所以,我定义了

Plus
Minus
Mult
Divd
,然后使用例如
df.eval("@custom_func(@Mult(col1, 2))")


0
投票

您可以使用 new_col_1 作为代理。

_test["new_col_6"] = _test.eval("@cumsum_function_test(new_col_1)")

输出

   col1  new_col_1  new_col_4  new_col_2  new_col_5  new_col_6
0     1          2          1          2          2          2
1     2          4          3          6          6          6
© www.soinside.com 2019 - 2024. All rights reserved.