2017-07-11 4 views
-1

Ich habe einen Anwendungsfall, wo ich ein Funktionsargument auf ein anderes Argument anwenden muss, das in der Regel eine Liste ist. Beispiel I muss möglicherweise min auf einer Liste, max auf einer Liste oder Summe auf einer Liste anwenden.Python gelten Lambda-Funktion

Als Ergebnis der letzten Return-Anweisung bekomme ich einen Fehler "Str Objekt ist nicht aufrufbar". Jede Hilfe, um diesen Trick zu machen, wird geschätzt.

+0

es, als ob agg_method sieht kommt als String zurück, den Sie dann als Funktion mit agg_method() verwenden wollen. Daher ist das error str Objekt nicht aufrufbar –

+0

Was erwarten Sie 'agg_func' zu sein? Es ist ein 'str', und Sie können keine Zeichenfolge aufrufen. Die Fehlermeldung ist ziemlich klar. Das hat, soweit ich das beurteilen kann, nichts mit Ihrem 'Lambda' zu tun. Ich muss jedoch sagen, dass dies eine ziemlich komische Art ist, ein Lambda zu verwenden, warum gibst du nicht einfach agg_func (tmp) zurück? Warum wickelst du das überhaupt in ein "Lambda"? Es bringt nichts, denn Sie wenden es sofort an und verwerfen es ... –

+0

agg_func ist in der Tat ein str (könnte die Werte "mean", "sum", "max", "min") haben. Und das ist natürlich das Problem, denn wenn ich gg_method (tmp, min) starte, funktioniert es. Wie wandle ich einen String wie "min" in die eigentliche Min-Funktion um? – NRG

Antwort

0

die Lösung ist ein Wörterbuch zu verwenden Strings um die Kartenfunktionen pandas.DataFrame

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

und dann die Nutzung:

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))) 

Dank für die Tipps