2016-04-07 3 views
0

適用されている関数内で関数が適用されているデータフレームを参照する方法を教えてください。適用されている関数内で関数が適用されているデータフレームを参照する方法

例えば、私はname_dfという名前のデータフレームを持っています。それは4列(指定されたインデックスなし)を持っています。

私はいくつかの引数(整数値とdfの混在)を取り入れたcalculate_statsという関数を持っています。私はname_df['name1']name_df['name2']

を参照したいcalculate_statsインサイド

私がやった:

name_df.apply(calculate_stats, axis=1, args=(r, df,x,y,z)) 

そして私はr['name1']r['name2']を使用calculate_statsの内側を。

しかし、以下ではNameError: name 'r' is not defined

を示すlink彼らは、データフレームDFに関数func1のを適用するエラーを得ました。 dfの各行を参照する引数はrとして指定されます。 func1の内側では、dfの列はr ['colname']を使って参照できます。どのように私は私の機能で同じことをするのですか?

In [37]: df 
Out[37]: 
    X Y Count 
0 0 1  2 
1 0 1  2 
2 1 1  2 
3 1 0  1 
4 1 1  2 
5 0 0  1 

In [38]: def func1(r): 
    ....:  print(r['X']) 
    ....:  print(r['Y']) 
    ....:  return r 
    ....: 
+0

現在の行は常に関数に渡される最初の引数になり、 'args'の引数は後に渡されます。 – IanS

答えて

1

として現在の行になりますargsの引数は後に渡されます。

私はあなたがやろうとしているものを正しく理解していれば、これは動作するはずです:

name_df.apply(calculate_stats, axis=1, args=(df, x, y, z)) 

rは、機能が適用されているデータフレームの現在の行です。これはcalculate_stats(r, df, x, y, z)を計算します。

+0

はい、これはまさに私がやりたいことです。あなたの提案はその問題を解決しました。しかし、今私は別の問題に遭遇しました。 df.apply()操作で複数のデータフレームを返すことは可能ですか?あるいは、df1、df2 = name_df.apply(calculate_stats、axis = 1、args =(df、x、y、z))のような処理をする必要があります。 – codingknob

+0

これはエラーです。ValueError:解凍するには1つ以上の値が必要です – codingknob

+0

可能性はありません。 'apply'は複数の列を持つ' df'データフレームを返し、次に 'df1 = df ['col1']'と 'df2 = df ['col2']'のようにします。 – IanS

0

あなたはインスタンスのようにラムダを使用してみました:

name_df['concat'] = name_df.apply(lambda x: x['name1'] + x['name2']) 

x、現在の行が常に関数に渡される最初の引数になりますdictの

+0

calculate_stats()は複雑な関数なので、私はラムダを使用しませんでした。入力データフレームdfに対して多くの演算を実行し、結果としていくつかのデータフレームを生成します。基本的には、name_df ['name1']とname_df ['name2']を抽出し、name_dfのすべての行を繰り返し、name1とname2の組み合わせごとに操作を実行します。 – codingknob

関連する問題