繁体   English   中英

将列作为 arguments 传递给 pandas groupby 应用 function

[英]Passing columns as arguments to pandas groupby apply function

假设我有以下 dataframe:

a = np.random.rand(10)
b = np.random.rand(10)*10
c = np.random.rand(10)*100
groups = np.array([1,1,2,2,2,2,3,3,4,4])
df = pd.DataFrame({"a":a,"b":b,"c":c,"groups":groups})

我只是想根据组按 df 分组,并将以下 function 应用于每组的两列(a 和 b):

def my_fun(x,y):
    tmp =  np.sum((x*y))/np.sum(y)
    return tmp

我尝试的是:

df.groupby("groups").apply(my_fun,("a","b"))

但这不起作用并给我错误:

ValueError: Unable to coerce to Series, the length must be 4: given 2 

最终的output基本上是每组一个数。 我可以通过循环解决问题,但我认为应该有更好的方法?

谢谢

在不更改 function 的情况下,您想要执行以下操作:

df.groupby("groups").apply(lambda d: my_fun(d["a"],d["b"]))

Output:

groups
1    0.603284
2    0.183289
3    0.828273
4    0.361103
dtype: float64

也就是说,您可以重写您的 function 以便将 dataframe 作为第一个位置参数:

def myfunc(data, val_col, weight_col):
    return np.sum(data[val_col]*data[weight_col])/np.sum(data[weight_col])

df.groupby('groups').apply(myfunc, 'a', 'b')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM