web-dev-qa-db-ja.com

python pandas:引数を持つ関数をシリーズに適用します

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()が処理されるように更新されていることを尋ねられたため、位置引数とキーワード引数、および上記のドキュメントリンクはそれを反映し、いずれかのタイプの引数を含める方法を示しています。

105
Abe

ドキュメントはこれを明確に説明しています。 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)

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

127
Bakuriu

手順:

  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番目は「適用」関数に渡すものです。この場合、キーワード引数「i2」を使用して、「9」を適用関数に渡します。

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

args : Tuple

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

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)
18
Ted Petrou