迭代 groupby

时间:2021-05-05 10:25:14

标签: python pandas dataframe dictionary

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

想象一下,我有另一个数据框,其中包含一些组和一些相应的 x 值。我想要做的是使用字典中的拟合参数获取第二个数据集中 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)})

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

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 的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

使用 lambda 函数:

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

答案 1 :(得分:0)

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

", "

对我来说,这比使用熔化和旋转(另一个建议)更具可读性,并且它增加了使用多列构建 auto result = input | rv::split(", "sv); 的额外灵活性。这很有用,因为在我的实际问题中,除了用作 def f(x): x['ycalc'] = func(params[x.name],x['c']) return x df.groupby(['a','b']).apply(f) 输入的 df['ycalc'] 之外,我还有 df['d']df['e'] 列。