我想将自定义函数应用于 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。
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()
函数有多个输入,其中一个是组值。有什么简单的方法可以做到这一点吗?
要将cpk2需要多个参数(包括组值)的自定义函数应用于groupby,您可以使用apply方法而不是agg。这允许您传递其他参数。
cpk2
groupby
apply
agg
下面展示了如何cpk2使用附加参数lsl和来应用该函数usl:
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)
a
b
c
value
lambda
x
这样,您可以将额外的参数传递到函数中,而无需改变groupby操作的基本结构。