2015-10-19 27 views
7

Mam metodę o nazwie counting, która pobiera 2 argumenty. Muszę wywołać tę metodę za pomocą metody apply(). Jednak kiedy jestem przekazując dwa parametry do metody stosuje się go daje następujący błąd:Jak przekazywać wiele argumentów do funkcji apply

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

widziałem wątku python pandas: apply a function with arguments to a series. Update i nie chcę używać functool.partial jak nie chcesz importować dodatkowe klasy, aby móc przekazywać parametry.

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

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

Jeśli dam jeden parametr, to działa:

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

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

Co to jest "dic" i skąd się tego bierze? Jaki jest twój problem z "częściowym"? To część standardowej biblioteki ... – tzaman

+0

Skąd chcesz, żeby powstał drugi argument? –

+0

Zmodyfikowano pytanie, aby uzyskać większą jasność. dic jest wartością kolumny, która pojawiałaby się domyślnie za pomocą funkcji apply. Drugi argument to nowy argument przekazywany za pomocą logiki. – Bonson

Odpowiedz

12

może po prostu użyć lambda:

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

Z drugiej strony, nie ma absolutnie nic złego w używaniu partial tutaj:

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

Jak wspomina @EdChum, jeśli metoda counting jest właściwie tylko patrząc słowo lub zalegających ją do zera, można po prostu użyć poręczny dict.get metodę zamiast pisać samemu:

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

oraz nieprzestrzegania lambda sposób na powyższe, poprzez moduł operator:

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

To daje mi wymagane rozwiązanie. Dziękuję Ci. Na twoje wcześniejsze pytanie założyłem, że ta metoda byłaby lepsza niż użycie częściowego. Czy to jest poprawne? Ponadto, jeśli to możliwe, potwierdź moje zrozumienie tego rozwiązania, że ​​tutaj wartość kolumny jest przekazywana do zmiennej dic, która jest następnie przekazywana do metody liczenia wraz z inną wartością zmiennej. – Bonson

+1

'partial' jest tutaj równoważne, lambda nie jest" lepsza "w żaden sposób: np. 'countWord = partial (liczenie, strWord = 'word')', a następnie 'apply (countWord)'. I tak, twoje zrozumienie jest poprawne. – tzaman

+0

Myślę, że w tym przypadku możesz po prostu zrobić 'DF ['new_column'] = DF ['dic_column']. Apply (lambda x: dic.get (x, 0))' – EdChum

3

Zaakceptowanych odpowiedź jest całkowicie doskonały. Nauczyłem mnie kilku interesujących rzeczy o Pythonie. Ale dla przyjemności, tutaj jest dokładnie to, czego szukamy:

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

Dzięki za napisanie pytania!

+0

To jest dokładnie to, czego szukałem. Dziękuję –

+0

Chciałbym wiedzieć, dlaczego to działa, to tylko kwestia zakresu? –

Powiązane problemy