2017-11-07 2 views
2

Ich benutze Python 3.X.Wie kann ich eine benutzerdefinierte Funktion innerhalb eines Ausdrucks mit der Eval Dataframe-Methode verwenden?

Mit der eingebauten Funktion eval() Sie eine dictionaty von Objekten verwenden können, um eine benutzerdefinierte Funktion wie folgt zu verwenden:

from math import * 

def one(): 
    # some operations 
    return 1 

functions = { 
    '__builtins__': None, 
    'sqrt': sqrt, 
    'one': one, 
} 
variables = { 
    '__builtins__': None, 
    'pi': pi, 
} 
expression = 'sqrt(34 * pi) + one()' 
eval(expression, variables, functions) 

Aber die eval() Datenrahmen Methode funktioniert nicht so. Sie können nur diese integrierten Funktionen nutzen:

Die unterstützten mathematischen Funktionen sin sind, cos, exp, log, expm1, log1p, sqrt, sinh, cosh, tanh, arcsin, arccos, arctan, arccosh, arcsinh , arctanh, abs und arctan2

import pandas as pd 
import numpy as np 
from math import * 

df = pd.DataFrame({ 
    'A': [0, 10, 0, 10, 10, 30], 
    'B': [0, 0, 1000, 1000, 0, 0], 
    'C': [25, 25, 25, 25, 40, 40] 
}) 

def custom(): 
    # some operations 
    return 3 

functions = { 
    'custom': custom 
} 
variables = { 
    'pi': pi 
} 
equation = 'D = sqrt(A) + B + custom()' 
df.eval(
    equation, global_dict=variables, local_dict=functions, 
    engine='numexpr', inplace=True 
) 
# ERROR: "custom" is not a supported function 

gibt es eine Möglichkeit, eine benutzerdefinierte Funktion in dem Ausdruck zu benutzen?

HINWEIS: Ich weiß, es könnte bedangerous, aber es ist mir

Antwort

4

Verwenden @ wenn lokale Variablen oder lokale Funktionen aufrufen:

In [45]: equation = 'D = sqrt(A) + B + @custom()' 
# NOTE: ------------>    ^

In [46]: df.eval(equation, inplace=True) 

In [47]: df 
Out[47]: 
    A  B C   D 
0 0  0 25  3.000000 
1 10  0 25  6.162278 
2 0 1000 25 1003.000000 
3 10 1000 25 1006.162278 
4 10  0 40  6.162278 
5 30  0 40  8.477226 
+0

etwas Neues gelernt Sir. +1 – Dark

+0

@Bharath, danke! :) – MaxU

+0

Danke @maxu, woher weißt du das? haha Ich habe es getestet und ich habe [eine andere Frage dazu] (https://stackoverflow.com/questions/47163401/how-to-return-a-numpy-array-or-list-in-a-custom -function-using-the-eval-datafram) – ChesuCR

Verwandte Themen