Python 在通过groupby进行迭代时,使用函数中的组名向dataframe添加列

Python 在通过groupby进行迭代时,使用函数中的组名向dataframe添加列,python,pandas,dataframe,dictionary,Python,Pandas,Dataframe,Dictionary,我有一组数据,我使用一个函数进行拟合,这产生了一个带有拟合参数的dict,其中键对应于可能的组名 假设我有另一个数据帧,其中包含一些组和一些对应的x值。我想做的是使用dict中的拟合参数获取第二个数据集中x值的y值,而不将参数合并到第二个数据集中 下面是我想做的一个简单例子。首先,我有一个使用拟合参数的函数,而不是实际参数: def funcx,p: y=0 对于我在rangelenp: y+=p[i]*x**i 返回y 具有第二个数据集的数据帧,该数据集由要分组的两列和一些对应的x值组成: d

我有一组数据,我使用一个函数进行拟合,这产生了一个带有拟合参数的dict,其中键对应于可能的组名

假设我有另一个数据帧,其中包含一些组和一些对应的x值。我想做的是使用dict中的拟合参数获取第二个数据集中x值的y值,而不将参数合并到第二个数据集中

下面是我想做的一个简单例子。首先,我有一个使用拟合参数的函数,而不是实际参数:

def funcx,p: y=0 对于我在rangelenp: y+=p[i]*x**i 返回y 具有第二个数据集的数据帧,该数据集由要分组的两列和一些对应的x值组成:

df=pd.DataFrame{'a':np.random.randint3,size=20, “b”:np.random.randint3,大小=20, “x”:np.random.randint10,高=20,大小=20} 带有df拟合参数组的dict通常是dict键的样本:

params={key:np.random.randint5,对于df.groupby['a','b'].groups.keys}中的键,size=3 现在我想计算一个新列“ycalc”,使用组名作为参数的选择器,并应用该函数。在我的脑海中,这看起来像:

对于名称,df.groupby['a','b']中的组: df['ycalc']=funcparams[name],组['c'] 但是,对于每个组,整个列都会被覆盖,从而为组外的所有成员生成NaN。另一个逻辑解决方案是使用transform,但是我不能使用组名作为输入,不管可能存在其他语法错误:

df['ycalc']=df.groupby['a','b']['x'].transformfunc,args=params[name] 获取列ycalc的最佳方法是什么?

使用lambda函数:

df['ycalc'] = df.groupby(['a','b'])['x'].transform(lambda x: func(x, p[x.name]))

从接受答案下的讨论中,我分享了我最终使用的解决方案,该解决方案也是由jezrael提出的:

def f(x):
    x['ycalc'] = func(params[x.name],x['c'])
    return x

df.groupby(['a','b']).apply(f)

对我来说,这比使用melt和pivoting另一个建议更具可读性,它增加了使用多个列构造df['ycalc']的额外灵活性。这很方便,因为在我真正的问题中,除了df['c']之外,我还有df['d']和df['e']列,它们被用作func的输入。

有时这比人们想象的要容易。。。你的回答太快了,我还不能接受。这对我的例子来说非常有效,但我当然过分简化了我的实际问题。在我的实际问题中,我有多个在func中调用的列x,例如“x1”、“x2”和“x3”。似乎transform一次只通过lambda x传递一列,而不是整个组。在这种情况下,我应该使用apply,还是有一个很好的替代方法,可以像transform一样将所有内容重新格式化为原始df的列格式?@Adriaan-Hmm,所以需要为多个列处理相同的函数?像df['ycalc1','ycalc2','ycalc3']]=df.groupby['a','b']['x1','x2','x3']].transformlambda x:funcx,p[x.name]?不,只有一个输出数组,类似于y+=p[i]*df['x1']**i+p[i]*x['x2']**i-1+p[i]*x['x2']**]**i-2,其中funcx,p变成funcdf,p,p,所以我假设x是一个数据帧。让我知道,如果这与原来的帖子偏离太多,我可以再问一个问题。@Adriaan-我认为groupby.apply是必要的,因为在groupby.transform中,transform不能与x1、x2、x2并行工作,在groupby.transform中有多个列,如df.groupby['a','b'][['x1','x2','x3']]。transform分别处理每一列。这意味着先是x1,然后是x2,最后是x3