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

Posted

技术标签:

【中文标题】Python Pandas:将参数传递给 agg() 中的函数【英文标题】:Python Pandas: Passing arguments to a function in agg() 【发布时间】:2017-11-18 12:13:25 【问题描述】:

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

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

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

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

在下面的代码中,我可以将这个函数与默认的b 值一起使用,但我想传递其他值:

>>> df.groupby('y').agg(translate_mean)
      x
y
a   NaN
b  11.5

有什么想法吗?

【问题讨论】:

相关:***.com/q/48843887/4050261 我相信这可能会有所帮助。 pandas-docs.github.io/pandas-docs-travis/user_guide/… 【参考方案1】:

只需将作为参数传递给agg(这也适用于apply)。

df.groupby('y').agg(translate_mean, b=4)
Out: 
     x
y     
a  NaN
b  5.5

【讨论】:

缺少使用lambas,在跨多个函数聚合时这可能吗?例如,df.groupby('y').agg([translate_mean, translate_mean]),我想先翻译 4,然后翻译 8?【参考方案2】:

也许你可以尝试在这种情况下使用apply

df.groupby('y').apply(lambda x: translate_mean(x['x'], 20))

现在结果是:

y
a     NaN
b    21.5

【讨论】:

【参考方案3】:

万一您有多个列,并且您想为每列应用不同的函数和不同的参数,您可以将 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)

对列“y”进行分组,并为列“x”应用函数 translate_mean,b=10; b=25 for col 'z',你可以试试这个:

df_res = df.groupby(by='a').agg(
    'x': lambda x: translate_mean(x, 10),
    'z': lambda x: translate_mean(x, 25))

希望对您有所帮助。

【讨论】:

以上是关于Python Pandas:将参数传递给 agg() 中的函数的主要内容,如果未能解决你的问题,请参考以下文章

Python:如何将 def 中的参数传递给 pandas loc 中的输入?

如何将 pandas 数据框作为参数传递给 matplotlib 库方法 plot

如何将另一整列作为参数传递给 pandas fillna()

如何在 PySpark 中将多个参数传递给 Pandas UDF?

在Pandas中,我如何将一个函数应用到数据框的某一行,其中行中的每一项都应该作为参数传递给函数?

dajaxice:将参数传递给 python 函数