Pythonパンダ:引数付きの関数をシリーズに適用する


147

引数付きの関数をpython pandasのシリーズに適用したい:

x = my_series.apply(my_function, more_arguments_1)
y = my_series.apply(my_function, more_arguments_2)
...

ドキュメントには、この方法を適用するためのサポートを説明したが、それは引数を受け付けません。引数を受け入れる別のメソッドはありますか?または、簡単な回避策がありませんか?

更新(2017年10月): この質問はもともとパンダapply()が位置引数とキーワード引数を処理するように更新されていることを尋ねられたため、上記のドキュメントリンクはこれを反映し、いずれかのタイプの引数を含める方法を示しています。


3
理由だけではなく、使用しないfunctools.partial、またはstarmap
Joel Cornett 2012

回答:


170

新しいバージョンのパンダで、追加の引数を渡すことできます(新しいドキュメントを参照)。だから今できること:

my_series.apply(your_function, args=(2,3,4), extra_kw=1)

位置引数はシリーズの要素のに追加されます。


古いバージョンのパンダの場合:

ドキュメントはこれを明確に説明しています。applyメソッドは、単一のパラメータを持つはずのPython関数を受け入れます。より多くのパラメーターを渡したい場合は、使用する必要がありますfunctools.partialは、Joel Cornettのコメントで提案されているように。

例:

>>> import functools
>>> import operator
>>> add_3 = functools.partial(operator.add,3)
>>> add_3(2)
5
>>> add_3(7)
10

を使用してキーワード引数を渡すこともできますpartial

別の方法はラムダを作成することです:

my_series.apply((lambda x: your_func(a,b,c,d,...,x)))

しかし、私は使用するpartial方が良いと思います。


12
DataFrameの場合、applyメソッドはargs引数を受け入れます。これは、追加の位置引数または名前付きの** kwdsを保持するタプルです。これをSeries.apply()github.com/pydata/pandas/issues/1829
Wouter Overmeireに

28
機能が実装されました。次のパンダリリースに含まれる予定です
ウェスマッキーニー

4
これは良い答えですが、最初の2/3は現在は時代遅れです。IMO、この回答は、新しいドキュメントへのリンクに加えて、位置やキーワード引数を使用する方法の簡単な例にするだけで、うまく更新できます。特に頻繁に読まれる回答であるため、元の回答に対する批判ではなく、FWIWだけが更新IMOの恩恵を受けるだけです。
JohnE、2017年

@watsonicドキュメンテーションは更新されており、古いリンクをクリックすると、現在のドキュメンテーションが表示され、質問に非常によく答えることができます。
JohnE

注:あなたは、単一の文字列引数を渡す場合、たとえば'abc'、その後、args=('abc')3つの引数として評価されます('a', 'b', 'c')。これを回避するには、文字列を含むタプルを渡す必要があり、それを行うには、末尾のカンマが含まれます:args=('abc',)
ロッキーK

82

手順:

  1. データフレームを作成する
  2. 関数を作成する
  3. 関数の名前付き引数をapplyステートメントで使用します。

x=pd.DataFrame([1,2,3,4])  

def add(i1, i2):  
    return i1+i2

x.apply(add,i2=9)

この例の結果は、データフレームの各数値が数値9に追加されることです。

    0
0  10
1  11
2  12
3  13

説明:

「追加」関数には、i1、i2の2つのパラメーターがあります。最初のパラメーターはデータフレームの値で、2番目のパラメーターは「apply」関数に渡すものです。この場合、キーワード引数「i2」を使用して「9」を適用関数に渡します。


2
まさに私が探していたもの。特に、Series(またはdf)を処理するためだけにカスタム関数を作成する必要はありません。パーフェクト!
コナー

残っている唯一の質問は、キーワード引数をadd(i1)の最初の引数に渡し、i2で繰り返す方法ですか?
コナー

これが最良の答えだと思います
クリプディック

43
Series.apply(func, convert_dtype=True, args=(), **kwds)

args : tuple

x = my_series.apply(my_function, args = (arg1,))

11
ありがとう!args =(arg1、)が最初の引数の後にコンマが必要な理由を説明できますか?
DrMisha

21
Pythonは長さ1のタプルであることを括弧内容を理解するため@MishaTeplitskiyは、あなたが順番にカンマが必要
prooffreader

3
以下のための引数に入れてはどうfunc。それで私が適用したい場合、pd.Series.mean(axis=1)どのように入れますかaxis=1
リトルボビーテーブル

1
補足として、<args>パラメーターを使用せずにキーワード引数を追加することもできます(例:x = my_series.apply(my_function、keyword_arg = arg1)。ここで、<keyword_arg>はmy_functionの入力パラメーターの1つです)
lev

1
この応答は短すぎて何も説明されていません
FistOfFury

23

apply名前なし引数、タプルとしてargsパラメーターに渡される、またはkwdsパラメーターによってディクショナリーとして内部的にキャプチャーされる他のキーワード引数のいずれかを介して、呼び出している関数に任意の数の引数を渡すことができます。

たとえば、3〜6の値に対してTrueを返し、それ以外の場合はFalseを返す関数を作成してみましょう。

s = pd.Series(np.random.randint(0,10, 10))
s

0    5
1    3
2    1
3    1
4    6
5    0
6    3
7    4
8    9
9    6
dtype: int64

s.apply(lambda x: x >= 3 and x <= 6)

0     True
1     True
2    False
3    False
4     True
5    False
6     True
7     True
8    False
9     True
dtype: bool

この無名関数はあまり柔軟ではありません。シリーズに必要な最小値と最大値を制御する2つの引数を持つ通常の関数を作成してみましょう。

def between(x, low, high):
    return x >= low and x =< high

名前のない引数をに渡すことにより、最初の関数の出力を複製できますargs

s.apply(between, args=(3,6))

または、名前付き引数を使用できます

s.apply(between, low=3, high=6)

または両方の組み合わせ

s.apply(between, args=(3,), high=6)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.