我尝试使用带有
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
以便在自定义函数中使用它?
结果:
我也有同样的问题。我解决了间接方法。当自定义函数输入具有算术表达式时,会出现此问题。但是自定义函数可以获取另一个函数作为输入。所以,我定义了
Plus
、Minus
、Mult
、Divd
,然后使用例如df.eval("@custom_func(@Mult(col1, 2))")
。
您可以使用 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