python pandasのシリーズに引数付きの関数を適用したい:
x = my_series.apply(my_function, more_arguments_1)
y = my_series.apply(my_function, more_arguments_2)
...
documentation は、applyメソッドのサポートについて説明していますが、引数を受け入れません。引数を受け入れる別の方法はありますか?または、簡単な回避策がありませんか?
更新(2017年10月):この質問はもともとpandas apply()
が処理されるように更新されていることを尋ねられたため、位置引数とキーワード引数、および上記のドキュメントリンクはそれを反映し、いずれかのタイプの引数を含める方法を示しています。
ドキュメントはこれを明確に説明しています。 applyメソッドは、単一のパラメーターを持つpython関数を受け入れます。さらにパラメーターを渡したい場合は、Joel Cornettのコメントで提案されているfunctools.partial
を使用する必要があります。
例:
>>> 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
を使用する方が良いと思います。
pandasdoの新しいバージョンでは、追加の引数を渡すことができます( 新しいドキュメント を参照) 。そのため、次のことができます。
my_series.apply(your_function, args=(2,3,4), extra_kw=1)
位置引数は、シリーズの要素の後に追加されます。
手順:
例
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番目は「適用」関数に渡すものです。この場合、キーワード引数「i2」を使用して、「9」を適用関数に渡します。
Series.apply(func, convert_dtype=True, args=(), **kwds)
args : Tuple
x = my_series.apply(my_function, args = (arg1,))
apply
が呼び出している関数には、名前のない引数、args
パラメーターにTupleとして渡された関数、または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
この匿名関数はあまり柔軟性がありません。 Seriesで必要な最小値と最大値を制御する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)