Python Pandas:将参数传递给agg()中的函数

Tan*_*guy 5 python group-by aggregate pandas

我试图通过使用不同类型的函数和参数值来减少pandas数据框中的数据.但是,我没有设法更改聚合函数中的默认参数.这是一个例子:

>>> df = pd.DataFrame({'x': [1,np.nan,2,1],
...                    'y': ['a','a','b','b']})
>>> df
     x  y
0  1.0  a
1  NaN  a
2  2.0  b
3  1.0  b
Run Code Online (Sandbox Code Playgroud)

这是一个聚合函数,我想测试它的不同值b:

>>> def translate_mean(x, b=10):
...   y = [elem + b for elem in x]
...   return np.mean(y)
Run Code Online (Sandbox Code Playgroud)

在下面的代码中,我可以使用此函数的默认b值,但我想传递其他值:

>>> df.groupby('y').agg(translate_mean)
      x
y
a   NaN
b  11.5
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

小智 10

如果您有多列,并且想要为每列应用不同的函数和不同的参数,则可以将 lambda 函数与 agg 函数结合使用。例如:

>>> df = pd.DataFrame({'x': [1,np.nan,2,1],
...                    'y': ['a','a','b','b']
                       'z': ['0.1','0.2','0.3','0.4']})
>>> df
     x  y  z
0  1.0  a  0.1
1  NaN  a  0.2
2  2.0  b  0.3
3  1.0     0.4

>>> def translate_mean(x, b=10):
...   y = [elem + b for elem in x]
...   return np.mean(y)
Run Code Online (Sandbox Code Playgroud)

按列“y”分组,并对列“x”应用函数translate_mean,其中b=10;b=25 对于 col 'z',你可以试试这个:

df_res = df.groupby(by='a').agg({
    'x': lambda x: translate_mean(x, 10),
    'z': lambda x: translate_mean(x, 25)})
Run Code Online (Sandbox Code Playgroud)

希望它能有所帮助。


Bub*_*Gut 5

apply在这种情况下,也许您可以尝试使用:

df.groupby('y').apply(lambda x: translate_mean(x['x'], 20))
Run Code Online (Sandbox Code Playgroud)

现在的结果是:

y
a     NaN
b    21.5
Run Code Online (Sandbox Code Playgroud)


ayh*_*han 5

只是作为参数传递agg(这也适用apply).

df.groupby('y').agg(translate_mean, b=4)
Out: 
     x
y     
a  NaN
b  5.5
Run Code Online (Sandbox Code Playgroud)

  • 如果不使用ambas,在跨多个函数聚合时这可能吗?例如, `df.groupby('y').agg([translate_mean, translate_mean])` 我想先翻译 4,然后翻译 8? (4认同)