2015-10-19 13 views
7

Ich habe eine Methode namens Zählen, die 2 Argumente dauert. Ich muss diese Methode mit der Methode apply() aufrufen. Allerdings, wenn ich vorbei an den zwei Parameter an die Anwendung Methode ist es die folgenden Fehler geben:Wie übergeben mehrere Argumente an die Funktion anwenden

TypeError: counting() takes exactly 2 arguments (1 given)

ich folgenden Thread gesehen habe python pandas: apply a function with arguments to a series. Update und ich will nicht verwenden functool.partial wie ich will nicht importieren zusätzliche Klassen, um Parameter übergeben zu können.

def counting(dic, strWord): 
    if strWord in dic: 
     return dic[strWord] 
    else: 
     return 0 

DF['new_column'] = DF['dic_column'].apply(counting, 'word') 

Wenn ich einen einzelnen Parameter geben, es funktioniert:

def awesome_count(dic): 
    if strWord in dic: 
     return dic[strWord] 
    else: 
     return 0 

DF['new_column'] = DF['dic_column'].apply(counting) 
+0

Was ist 'dic' und woher soll es kommen? Was ist dein Problem mit "partially"? Es ist Teil der Standardbibliothek ... – tzaman

+0

Woher soll das zweite Argument kommen? –

+0

Modifizierte die Frage für mehr Klarheit. dic ist der Spaltenwert, der standardmäßig über die Funktion apply ausgegeben wird. Das zweite Argument ist ein neues Argument, das mit Logik übergeben wird. – Bonson

Antwort

12

Sie könnten nur lambda verwenden:

DF['new_column'] = DF['dic_column'].apply(lambda dic: counting(dic, 'word')) 

Auf der anderen Seite gibt es absolut nichts falsch mit partial mit hier:

from functools import partial 
count_word = partial(counting, strWord='word') 
DF['new_column'] = DF['dic_column'].apply(count_word) 

Wie @EdChum erwähnt, wenn Ihre counting Methode ist eigentlich nur ein Wort suchen oder auf Null säumige, können Sie einfach die handliche dict.get Methode verwenden anstelle einem Schreiben selbst:

DF['new_column'] = DF['dic_column'].apply(lambda dic: dic.get('word', 0)) 

Und ein nicht lambda Weg, um die oben genannten zu tun, über das operator Modul:

from operator import methodcaller 
count_word = methodcaller(get, 'word', 0) 
DF['new_column'] = DF['dic_column'].apply(count_word) 
+1

Das gibt mir die erforderliche Lösung. Vielen Dank. Zu Ihrer früheren Frage hatte ich angenommen, dass diese Methode besser wäre als die partielle. Ist es richtig? Wenn möglich, bestätigen Sie bitte mein Verständnis dieser Lösung, dass hier der Wert der Spalte an die Variable dic übergeben wird, die dann an die Methode übergeben wird, die zusammen mit einem anderen Variablenwert zählt. – Bonson

+1

"teilweise" ist hier äquivalent, Lambda ist in keiner Weise "besser": z.B. 'countWord = partially (zählend, strWord = 'word')' und dann 'apply (countWord)'. Und ja, dein Verständnis ist richtig. – tzaman

+0

Ich denke in diesem Fall können Sie einfach 'DF ['neue_Spalte'] = DF ['dic_column']. Anwenden (Lambda x: dic.get (x, 0))' – EdChum

3

die akzeptierte Antwort ganz perfekt ist. Hat mir einige interessante Dinge über Python beigebracht. Aber nur zum Spaß, hier geht es genau das, was wir suchen:

selected_words = ['awesome', 'great', 'fantastic', 'amazing', 'love', 'horrible', 'bad', 'terrible', 'awful', 'wow', 'hate'] 
for this_word in selected_words: 
    products[this_word] = products['word_count'].apply(lambda dic: dic.get(this_word, 0)) 

Vielen Dank für die Frage der Veröffentlichung!

+0

Genau das habe ich gesucht. Vielen Dank –

+0

Ich würde gerne wissen, warum das funktioniert ¿ist nur eine Frage des Scoping? –

Verwandte Themen