使用Pandas groupby()+ apply()和参数

时间:2017-04-18 22:40:13

标签: python pandas dataframe apply pandas-groupby

我想将df.groupby()apply()结合使用,将函数应用于每个组的每一行。

我通常使用以下代码,通常可以使用(请注意,这不是groupby()):

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

使用groupby()我尝试了以下内容:

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

但是,我收到以下错误:

  

TypeError:myFunction()得到了一个意外的关键字参数' args'

因此,我的问题是:如何将groupby()apply()与需要参数的函数一起使用?

3 个答案:

答案 0 :(得分:16)

pandas.core.groupby.GroupBy.apply没有命名的参数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

答案 1 :(得分:5)

为什么使用args参数会引发错误,可能会产生一些混淆可能源于pandas.DataFrame.apply确实有args参数(元组)的事实,而pandas.core.groupby.GroupBy.apply没有。

因此,当您在DataFrame上调用.apply时,您可以使用此参数;当你在groupby对象上调用.apply时,你不能。

在@ MaxU的回答中,表达式lambda x: myFunction(x, arg1)被传递给func(第一个参数);无需指定其他*args / **kwargs,因为在lambda中指定了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'

答案 2 :(得分:1)

对我

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

工作