python - 迭代 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 的最佳方法是什么?
解决方案
使用 lambda 函数:
df['ycalc'] = df.groupby(['a','b'])['x'].transform(lambda x: func(x, p[x.name]))
推荐阅读
- memory - OpenCL 内存传输函数如何工作?
- react-native - EXPO : 将文件系统导出到文件,进入 android 文件夹
- jmeter - 虽然控制器完成后没有执行下一个线程
- c# - 绑定到页面上 UserControl 的自定义依赖属性不起作用
- apache-kafka - 由于突然终止,kafkastream 重新启动后未收到任何记录
- azure - 如何使用嵌套属性在 cosmos DB 中定义唯一键
- sql - 在 ORACLE:ORA-00923:FROM 关键字未指定
- node.js - Apache Kafka 2.3 + Node.js 10.15 + 消费者 + 生产者
- javascript - 在 Next.js 自定义服务器中记录错误的 Express 中间件
- python - ITK 过滤器上的非零退出代码