2016-11-21 20 views
3

私はPandasデータフレームを持っていて、apply()関数を使って1つの列のエントリに関数を渡そうとしています。パンダのデータフレームに関数を適用するためにラムダが必要なのはなぜですか?

My機能は次の形式になります。

def foo(Y): 
    #accepts a pandas data frame 
    #carries out some search on the text in each row of the dataframe 
    #groups successful searches 
    #return a new column as a pandas series 

私のデータフレームの形式は次のとおりです。

Info WN RN 
0 XX YY ZZ  
1 AA BB CC 
2 JJ KK LL 

私が実行しようとし、次のように

df['SR'] = (df['Info'].apply(foo(x))) 

私のエラーは、次のとおりです。

File "<ipython-input-11-ae54015436d8>", line 1, in <module> 
df['SR'] = (df['Info'].apply(foo(x)) 
NameError: name 'x' is not defined 

しかし、私は使用している場合:

df['SR'] = (df['Info'].apply(lambda x:foo(x))) 

それは正常に動作します。

ラムダの仕組みを理解しています(少なくとも私がやったと思いました)。私はそれがなぜ必要なのか分からない。

なぜデータフレーム上で関数を正常に渡すにはラムダが必要ですか? apply()関数はそれを定義で行うべきではありませんか?

または、データフレームを関数に繰り返し渡すのではなく、関数にデータフレームを渡して出力を返すことが効果的ですか?

誰でも洞察力を提供できますか?

よろしくお願いいたします。

+2

に動作します 'lambda'は必要ありません:' DF [ 'SR'] = DFの[」 Info ']。apply(foo) 'はうまくいくでしょう – EdChum

答えて

1

ラムダは不要で、あなただけの

df['SR'] = df['Info'].apply(foo) 

を行うことができ、ここで、それはまだこの場合

+0

それは奇妙です。私がここで全く同じことをしたとき、それはしないので。わかりやすくするために、完全なfooの内容でQを更新します。 – Chuck

+0

私の謝罪:あなたは正しいです。それは問題を解決します。私の次の質問はラムダがなぜ必要なのだろう? (おそらくそれは他の場所に適したより一般的な質問です) – Chuck

+2

理解するべきことは、 'lambda'は通常の関数定義の文法的砂糖です:https://docs.python.org/3/tutorial/ controlflow.html#lambda-expressionsには、単一の引数だけを受け入れることができる制限があります。個人的には、ラムダが通常のfuncではできないようなことはありません。 – EdChum