我正在尝试找出基于某种用户“配置”对数据帧转换进行功能化的最佳/最有效方法。

配置背后的想法是拥有一组默认的转换,然后允许用户自定义其他转换并将其添加到字典中。然后它们都将在“运行时”应用。

我想要某种数据框

    '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/

10-12 17:09
查看更多