我正在尝试找出基于某种用户“配置”对数据帧转换进行功能化的最佳/最有效方法。
配置背后的想法是拥有一组默认的转换,然后允许用户自定义其他转换并将其添加到字典中。然后它们都将在“运行时”应用。
我想要某种数据框
'a' 'b'
0 1 2
1 1 0
2 3 1
以及要应用的某种功能字典。理想情况下,要同时接受一元和非一元函数。
可以同时执行以下操作的设置
df['bool'] = df['a'] > 1
和
df['sumval'] = df['a'] + df['b']
现在,我有一个类似
config = {'bool': (lambda x: x['a'] > 1),
'sumval': (lambda x: x['a'] + x['b']}
for k, f in config.iteritems():
df[k] = df.apply(f, axis=1)
但是,我意识到这是非常低效的,尤其是随着函数数量的增加。由于apply每次都会在每一行上循环,因此除了失去广播的好处之外,无论您称其为什么,都像上面的boolean语句一样固有。
有什么想法吗?
最佳答案
您可以将config
中的公式作为列表进行跟踪。然后,您可以将它们传递给以eval
分隔的'\n'
方法。
config = ['bool = a > 1', 'sumVal = a + b']
df.eval('\n'.join(config), inplace=False)
a b bool sumVal
0 1 2 False 3
1 1 0 False 1
2 3 1 True 4
你可以看到
'\n'.join(config)
评估为
'bool = a > 1\nsumVal = a + b'
或类似的字典
config = {'bool': 'a > 1', 'sumVal': 'a + b'}
j, f = '\n'.join, '{} = {}'.format
df.eval(j([f(k, v) for k, v in config.items()]), inplace=False)
a b bool sumVal
0 1 2 False 3
1 1 0 False 1
2 3 1 True 4
在这种情况下
j([f(k, v) for k, v in config.items()])
还评估为
'bool = a > 1\nsumVal = a + b'
关于python - 将一组功能应用于数据框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46086258/