web-dev-qa-db-ja.com

Pandas groupby()+ apply()引数付きで使用

df.groupby()apply()と組み合わせて使用​​して、グループごとに各行に関数を適用したいと思います。

私は通常、次のコードを使用しますが、通常は機能します(これにはgroupby()がないことに注意してください)。

df.apply(myFunction, args=(arg1,))

groupby()を使用して、次のことを試しました。

df.groupby('columnName').apply(myFunction, args=(arg1,))

ただし、次のエラーが表示されます。

TypeError:myFunction()が予期しないキーワード引数 'args'を取得しました

したがって、私の質問は:引数を必要とする関数でgroupby()apply()を使用するにはどうすればよいですか?

21
beta

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
20
MaxU

ここで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'
_
6
Brad Solomon

私のために

df2 = df.groupby('columnName').apply(lambda x: my_function(x, arg1, arg2,))

働いた

3
Hitesh Somani