2015-10-19 8 views
7

У меня есть метод под названием counting, который принимает 2 аргумента. Мне нужно вызвать этот метод, используя метод apply(). Однако, когда я передаю два параметра для метода применения он дает следующее сообщение об ошибке:Как передать несколько аргументов функции apply

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

я видел следующую нить python pandas: apply a function with arguments to a series. Update, и я не хочу использовать functool.partial как я не хочу, чтобы импортировать дополнительные классы, чтобы иметь возможность передавать параметры.

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

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

Если я дам один параметр, он работает:

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

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

Что такое 'dic' и откуда вы его ожидаете? Кроме того, в чем проблема с 'partial'? Это часть стандартной библиотеки ... – tzaman

+0

Откуда вам был второй аргумент? –

+0

Изменен вопрос для большей ясности. dic - это значение столбца, которое будет отображаться по умолчанию с помощью функции apply. Второй аргумент - это новый аргумент, который передается с использованием логики. – Bonson

ответ

12

Вы можете просто использовать lambda:

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

С другой стороны, нет абсолютно ничего плохого в использовании partial здесь:

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

Как отмечает @EdChum, если ваш метод counting на самом деле просто глядя слово или недобросовестный его к нулю, вы можете просто использовать удобный dict.get метод вместо себя написанием:

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

И в не- lambda способ сделать выше, с помощью operator модуля:

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

Это дает мне необходимое решение. Спасибо. К вашему предыдущему вопросу я предположил, что этот метод будет лучше, чем использование частичного. Правильно ли это? Также, если это возможно, любезно подтвердите мое понимание этого решения, что здесь значение столбца передается переменной dic, которая затем передается методу, подсчитываемому вместе с другим значением переменной. – Bonson

+1

«partial» эквивалентен здесь, лямбда не «лучше» каким-либо образом: например. 'countWord = partial (counting, strWord = 'word')', а затем 'apply (countWord)'. И да, ваше понимание правильное. – tzaman

+0

Я думаю, что в этом случае вы можете просто сделать DF ['new_column'] = DF ['dic_column']. Apply (lambda x: dic.get (x, 0)) ' – EdChum

3

Принятого ответ абсолютно совершенный. Преподавал мне некоторые интересные вещи о Python. Но только для удовольствия, а точнее, то, что мы ищем:

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

Спасибо за сообщение!

+0

Это именно то, что я искал. Спасибо –

+0

Хотелось бы узнать, почему это работает ¿является предметом обзора? –

Смежные вопросы