首页 > 解决方案 > 迭代 groupby 时使用函数中的组名将列添加到 pandas 数据框

问题描述

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

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

这是我想做的一个简化示例。首先我有一个使用拟合参数的函数(不是真实的):

def func(x,p):
    y = 0
    for i in range(len(p)):
        y += p[i]*x**(i)
    return y

具有第二个数据集的 DataFrame,其中包含要分组的两列和一些相应的 x 值:

df = pd.DataFrame({'a': np.random.randint(3, size=20),
                   'b': np.random.randint(3, size=20),
                   'x': np.random.randint(10, high=20, size=20)})

具有拟合参数的 dict(df 组通常是 dict 键的样本):

params = {key: np.random.randint(5,size=3) for key in df.groupby(['a','b']).groups.keys()}

现在我想计算一个新列'ycalc',使用组名作为参数的选择器并应用该函数。在我看来,这看起来像:

for name, group in df.groupby(['a','b']):
    df['ycalc'] = func(params[name],group['c'])

但是随后每个组的整个列都被覆盖,为组外的所有成员产生 NaN。另一个合乎逻辑的解决方案是使用转换,但是我不能使用组名作为输入(不管可能的其他语法错误):

df['ycalc'] = df.groupby(['a','b'])['x'].transform(func, args=(params[name]))

获取列 ycalc 的最佳方法是什么?

标签: pythonpandasdataframedictionary

解决方案


使用 lambda 函数:

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

推荐阅读