2015-10-19 41 views
7

2つの引数を取るcountingというメソッドがあります。 apply()メソッドを使ってこのメソッドを呼び出す必要があります。しかし、私はそれが次のエラー与えて適用する方法に2つのパラメータを渡していたときに:私は次のスレッドpython pandas: apply a function with arguments to a series. Updateを見ていると私はインポートしないようfunctool.partial使用したくない複数の引数を適用関数に渡す方法

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

をパラメータを渡すための追加のクラス。

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

2番目の引数はどこから来たがっていますか? –

+0

もっと明確にするために質問を修正しました。 dicは、デフォルトでapply関数を介して取得される列の値です。 2番目の引数は、ロジックを使用して渡される新しい引数です。 – 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方法は実際にちょうど単語を調べるか、それをゼロにデフォルト設定されている場合、あなただけの1を自分で書くのではなく、便利なdict.getメソッドを使用することができます。

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

と非lambda

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(count、strWord = 'word')'そして 'apply(countWord)'を実行します。そして、はい、あなたの理解は正しいです。 – tzaman

+0

この場合、あなたは 'DF ['new_column'] = DF ['dic_column']を実行することができます。apply(lambda x:dic.get(x、0))' – EdChum

3

受け入れ答えは完全に完璧です:operatorモジュールを介して、上記を実行する方法。 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

私はなぜこれがうまく働くのかを知りたいのですが、スコープの問題ですか? –

関連する問題