我有一组使用函数拟合的数据,这产生了一个带有拟合参数的字典,其中键对应于可能的组名。
想象一下,我有另一个数据框,其中包含一些组和一些相应的 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 的最佳方法是什么?
答案 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']
列。