小能豆

使用具有多个输入的自定义函数进行 Groupby apply 或 agg

py

我想将自定义函数应用于 pandas groupby 函数。

当我的自定义函数只有 1 个输入(即分组值)时,我就可以应用。

我有这样的数据框:

a     b     c      value
a1    b1    c1      v1
a2    b2    c2      v2
a3    b3    c3      v3

适用版本:

def cpk(a):
    arr = np.asarray(a)
    arr = arr.ravel()
    sigma = np.std(arr)
    m = np.mean(arr)

    Cpu = float(150 - m) / (3*sigma)
    Cpl = float(m - 50) / (3*sigma)
    Cpk = np.min([Cpu, Cpl])
    return Cpk


df_cpk = df_result.groupby(['a','b','c'])['value'].agg(cpk).reset_index()

正如您在上面的代码中看到的,分组的“值”会自动进入函数的输入cpk

我想知道如何应用以下功能:

def cpk2(a,lsl,usl):
    arr = np.asarray(a)
    arr = arr.ravel()
    sigma = np.std(arr)
    m = np.mean(arr)

    Cpu = float(usl - m) / (3*sigma)
    Cpl = float(m - lsl) / (3*sigma)
    Cpk = np.min([Cpu, Cpl])
    return Cpk

# df_cpk = df_result.groupby(['a','b','c'])['value'].agg(cpk2(?,?,?)).reset_index()

函数有多个输入,其中一个是组值。有什么简单的方法可以做到这一点吗?


阅读 24

收藏
2024-12-03

共1个答案

小能豆

要将cpk2需要多个参数(包括组值)的自定义函数应用于groupby,您可以使用apply方法而不是agg。这允许您传递其他参数。

下面展示了如何cpk2使用附加参数lsl和来应用该函数usl

def cpk2(a, lsl, usl):
    arr = np.asarray(a)
    arr = arr.ravel()
    sigma = np.std(arr)
    m = np.mean(arr)

    Cpu = float(usl - m) / (3 * sigma)
    Cpl = float(m - lsl) / (3 * sigma)
    Cpk = np.min([Cpu, Cpl])
    return Cpk

# Assuming your dataframe looks like this:
import pandas as pd
import numpy as np

df_result = pd.DataFrame({
    'a': ['a1', 'a2', 'a3'],
    'b': ['b1', 'b2', 'b3'],
    'c': ['c1', 'c2', 'c3'],
    'value': [1, 2, 3]
})

# Your additional arguments
lsl = 50
usl = 150

# Applying the function using apply
df_cpk = df_result.groupby(['a', 'b', 'c'])['value'].apply(lambda x: cpk2(x, lsl, usl)).reset_index(name='cpk')

print(df_cpk)

解释:

  1. groupby用于按列ab和对数据框进行分组c
  2. apply用于cpk2对列的每一组应用该函数value
  3. lambda函数允许您传递附加参数(lslusl),cpk2同时仍使用组(x)作为第一个参数。

这样,您可以将额外的参数传递到函数中,而无需改变groupby操作的基本结构。

2024-12-03