web-dev-qa-db-ja.com

複数の引数を持つ関数をDataFrame.applyに渡す

次のようなデータフレームがあるとします。

df = pd.DataFrame([['foo', 'x'], ['bar', 'y']], columns=['A', 'B'])


       A    B
0    foo    x
1    bar    y

次のように、データフレームに関して、Applyで単一引数関数を使用する方法を知っています。

def some_func(row):
    return '{0}-{1}'.format(row['A'], row['B'])

df['C'] = df.apply(some_func, axis=1)

df


       A    B        C
0    foo    x    foo-x
1    bar    y    bar-y

データフレームに複数の入力引数が含まれている場合、データフレームに適用を使用するにはどうすればよいですか?これが私が欲しいものの例です:

def some_func(row, var1):
    return '{0}-{1}-{2}'.format(row['A'], row['B'], var1)

df['C'] = df.apply(some_func(row, var1='DOG'), axis=1)

df


       A    B            C
0    foo    x    foo-x-DOG
1    bar    y    bar-y-DOG

この1つの特定の例を解決するための回避策を探しているのではなく、一般にこのようなことを行う方法を探しています。どんなアドバイスでもよろしくお願いします。

10
Michael Henry

applyargskwargsを受け入れ、some_funcに直接渡します。

df.apply(some_func, var1='DOG', axis=1)

または、

df.apply(some_func, args=('DOG', ), axis=1)
0    foo-x-DOG
1    bar-y-DOG
dtype: object
7
cs95

ベクトル化されたロジックを使用する必要があります。

df['C'] = df['A'] + '-' + df['B'] + '-DOG'

本当に使いたいならdf.apply、つまり薄いベールループであり、引数を追加パラメーターとして単純にフィードできます。

def some_func(row, var1):
    return '{0}-{1}-{2}'.format(row['A'], row['B'], var1)

df['C'] = df.apply(some_func, var1='DOG', axis=1)

ドキュメントdf.applyは、位置引数とキーワード引数の両方を受け入れます。

3
jpp

私はそれができると思います

df.apply('-'.join,1)+'-DOG'
Out[157]: 
0    foo-x-DOG
1    bar-y-DOG
dtype: object
1
YOBEN_S