使用Python函数有效地处理DataFrame行?

在我们的熊猫使用代码的许多地方,我们有一些Python函数进程(行).该函数用于DataFrame.iterrows(),采取每一行,并进行一些处理,并返回一个值,我们最终收集到一个新的系列.

我意识到这种使用模式规避了numpy / Pandas堆栈的大部分性能优势.

>将这种使用模式如此高效的最佳方法是什么?
尽可能吗
>我们可以在不重写大部分代码的情况下执行此操作吗?

这个问题的另一个方面:所有这些功能都可以转换成高效率的表示?我非常了解numpy / scipy / Pandas堆栈,但似乎对于真正的任意逻辑,您有时可能需要使用像上述一样的缓慢的纯Python架构.是这样吗?

您应该沿轴= 1应用您的功能.函数将接收一行作为参数,它返回的任何东西将被收集到一个新的系列对象中

df.apply(you_function, axis=1)

例:

>>> df = pd.DataFrame({'a': np.arange(3),
                       'b': np.random.rand(3)})
>>> df
   a         b
0  0  0.880075
1  1  0.143038
2  2  0.795188
>>> def func(row):
        return row['a'] + row['b']
>>> df.apply(func, axis=1)
0    0.880075
1    1.143038
2    2.795188
dtype: float64

关于问题的第二部分:行明智的操作,即使是优化的,使用熊猫适用,也不是最快的解决方案.他们肯定比python for loop快很多,但不是最快的.您可以通过计时操作进行测试,您将看到差异.

一些操作可以转换为面向列的操作(在我的例子中有一个可以很容易地转换为只是df [‘a’] df [‘b’]),但是其他操作不能.特别是如果你有很多分支,特殊情况或其他逻辑应该在你的行执行.在这种情况下,如果应用对你来说太慢,我会建议你的代码“Cython”. Cython使用NumPy C api非常的出色,并且将为您提供最大的速度.

或者你可以试试numba. 🙂

翻译自:https://stackoverflow.com/questions/18282988/efficiently-processing-dataframe-rows-with-a-python-function

转载注明原文:使用Python函数有效地处理DataFrame行?