2017-07-11 1 views
-1

J'ai un cas d'utilisation où j'ai besoin d'appliquer un argument de fonction sur un autre argument qui est généralement une liste. Exemple Je pourrais avoir besoin d'appliquer min sur une liste, max sur une liste ou sur une liste. À la suite de la dernière déclaration de retour, j'obtiens une erreur "l'objet str n'est pas appelable". Toute aide pour faire ce tour est appréciée.python appliquer la fonction lambda

+0

Il semble que agg_method revient sous la forme d'une chaîne que vous essayez d'utiliser en tant que fonction avec agg_method(). Par conséquent, l'objet str d'erreur n'est pas appelable –

+0

qu'est-ce que vous attendez de 'agg_func'? C'est un 'str', et vous ne pouvez pas appeler une chaîne. Le message d'erreur est assez clair. Cela n'a rien à voir avec votre «lambda» autant que je sache. Je dois dire, cependant, c'est une façon assez bizarre d'utiliser un lambda, pourquoi ne pas juste retourner 'agg_func (tmp)'? Pourquoi emballes-tu cela dans un 'lambda'? Il ne contribue rien, puisque vous l'appliquez immédiatement et le supprimez ... –

+0

agg_func est en effet un str (pourrait avoir les valeurs "mean", "sum", "max", "min"). Et évidemment, c'est le problème, parce que quand j'exécute gg_method (tmp, min), ça marche. Comment puis-je convertir une chaîne comme "min" à la fonction min réelle? – NRG

Répondre

0

la solution est d'utiliser un dictionnaire pour mapper des chaînes à pandas.DataFrame fonctions

dispatcher={'min':pd.DataFrame.min, 'max':pd.DataFrame.max, 'sum': pd.DataFrame.sum, 'mean': pd.DataFrame.mean} 

et l'utilisation:

def calc_df_query(select_col, agg_func, where_col, mn, mx): 
    tmp = globals().get('data')[select_col][globals().get('data')[where_col].between(mn, mx, inclusive=True)] 
    agg_method = lambda col, agg: agg(col) 
    return (agg_method(tmp, dispatcher.get(agg_func))) 

merci pour les conseils