df.groupby()
をapply()
と組み合わせて使用して、グループごとに各行に関数を適用したいと思います。
私は通常、次のコードを使用しますが、通常は機能します(これにはgroupby()
がないことに注意してください)。
df.apply(myFunction, args=(arg1,))
groupby()
を使用して、次のことを試しました。
df.groupby('columnName').apply(myFunction, args=(arg1,))
ただし、次のエラーが表示されます。
TypeError:myFunction()が予期しないキーワード引数 'args'を取得しました
したがって、私の質問は:引数を必要とする関数でgroupby()
とapply()
を使用するにはどうすればよいですか?
pandas.core.groupby.GroupBy.apply
にはnamedパラメーターargs
がありませんが、 pandas.DataFrame.apply
にあります。
だからこれを試してください:
df.groupby('columnName').apply(lambda x: myFunction(x, arg1))
または @ Zero が示唆するとおり:
df.groupby('columnName').apply(myFunction, ('arg1'))
デモ:
In [82]: df = pd.DataFrame(np.random.randint(5,size=(5,3)), columns=list('abc'))
In [83]: df
Out[83]:
a b c
0 0 3 1
1 0 3 4
2 3 0 4
3 4 2 3
4 3 4 1
In [84]: def f(ser, n):
...: return ser.max() * n
...:
In [85]: df.apply(f, args=(10,))
Out[85]:
a 40
b 40
c 40
dtype: int64
GroupBy.apply
を使用する場合、名前付き引数を渡すことができます:
In [86]: df.groupby('a').apply(f, n=10)
Out[86]:
a b c
a
0 0 30 40
3 30 40 40
4 40 20 30
引数のタプル:
In [87]: df.groupby('a').apply(f, (10))
Out[87]:
a b c
a
0 0 30 40
3 30 40 40
4 40 20 30
ここでargs
パラメータを使用するとエラーがスローされる理由についての混乱は、 _pandas.DataFrame.apply
_ がargs
パラメータ(タプル)を持っているという事実に起因する可能性があります。 while _pandas.core.groupby.GroupBy.apply
_ はしません。
したがって、DataFrame自体で_.apply
_を呼び出す場合、この引数を使用できます。 groupbyオブジェクトで_.apply
_を呼び出すと、できません。
@MaxUの答えでは、式lambda x: myFunction(x, arg1)
がfunc
(最初のパラメーター)に渡されます。 _*args
_がラムダで指定されているため、追加の_**kwargs
_/_arg1
_を指定する必要はありません。
例:
_import numpy as np
import pandas as pd
# Called on DataFrame - `args` is a 1-Tuple
# `0` / `1` are just the axis arguments to np.sum
df.apply(np.sum, axis=0) # equiv to df.sum(0)
df.apply(np.sum, axis=1) # equiv to df.sum(1)
# Called on groupby object of the DataFrame - will throw TypeError
print(df.groupby('col1').apply(np.sum, args=(0,)))
# TypeError: sum() got an unexpected keyword argument 'args'
_
私のために
df2 = df.groupby('columnName').apply(lambda x: my_function(x, arg1, arg2,))
働いた