Dun*_*eal 12 python numpy pandas
在我们使用Pandas的代码中的许多地方,我们都有一些Python函数process(row).该函数被使用DataFrame.iterrows(),接受每个函数row,并进行一些处理,并返回一个值,我们最终收集到一个新的值Series.
我意识到这种使用模式绕过了numpy/Pandas堆栈的大部分性能优势.
这个问题的另一个方面是:所有这些功能都可以转换为高效率的表示吗?我非常了解numpy/scipy/Pandas堆栈,但似乎对于真正任意的逻辑,你有时可能需要使用像上面那样的慢速纯Python架构.是这样的吗?
Vik*_*kez 19
您应该沿轴= 1应用函数.函数将接收一行作为参数,它返回的任何内容都将被收集到一个新的系列对象中
df.apply(you_function, axis=1)
Run Code Online (Sandbox Code Playgroud)
例:
>>> 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
Run Code Online (Sandbox Code Playgroud)
至于问题的第二部分:使用pandas的行式操作,甚至是优化的操作,apply都不是最快的解决方案.他们肯定有很多比环巨蟒快,但不是最快的.你可以通过计时操作测试它,你会看到差异.
某些操作可以转换为面向列的操作(我的示例中的一个可以很容易地转换为just df['a'] + df['b']),但其他操作则不能.特别是如果你有很多分支,特殊情况或其他应该在你的行上执行的逻辑.在这种情况下,如果apply你的速度太慢,我会建议"Cython-izing"你的代码.Cython与NumPy C api非常合作,可以为您提供最大的速度.
或者你可以尝试numba.:)
| 归档时间: |
|
| 查看次数: |
10681 次 |
| 最近记录: |