Python 将列作为参数传递给groupby apply函数
假设我有以下数据帧:Python 将列作为参数传递给groupby apply函数,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,假设我有以下数据帧: 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分组,并将以下函数应用于每个组的两
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分组,并将以下函数应用于每个组的两列(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
最终输出基本上是每组的一个数字。我可以通过循环绕过这个问题,但我认为应该有更好的方法
谢谢在不更改功能的情况下,您要执行以下操作:
df.groupby("groups").apply(lambda d: my_fun(d["a"],d["b"]))
输出:
groups
1 0.603284
2 0.183289
3 0.828273
4 0.361103
dtype: float64
也就是说,您可以重写函数,使其将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')
谢谢效果很好。