3 回答
![?](http://img1.sycdn.imooc.com/545865470001bf9402200220-100-100.jpg)
TA贡献1871条经验 获得超8个赞
iterrows
1) vectorization2) using a custom cython routine3) apply a) reductions that can be performed in cython b) iteration in python space4) itertuples5) iterrows6) updating an empty frame (e.g. using loc one-row-at-a-time)
df.apply(lambda x: np.sum(x))
df.sum(1)
df.apply(lambda x: x['b'] + 1)
4) itertuples
5) iterrows
concat
.
![?](http://img1.sycdn.imooc.com/54584f3100019e9702200220-100-100.jpg)
TA贡献1851条经验 获得超4个赞
摊销式查找
:Python是一种动态类型化语言,因此数组中的每个元素都有运行时开销。然而,Numpy(因此也是熊猫)用C进行计算(通常是通过Cython)。数组的类型只有在迭代开始时才能确定;仅这一节省就是最大的胜利之一。 更好的缓存
在C数组上迭代是对缓存友好的,因此非常快。熊猫DataFrame是一个“面向列的表”,这意味着每个列实际上只是一个数组。因此,您可以在DataFrame上执行的本机操作(比如对列中的所有元素进行求和)将很少有缓存丢失。 更多并行的机会
一个简单的C数组可以通过SIMD指令操作。Numpy的某些部分支持SIMD,这取决于您的CPU和安装过程。并行化的好处不会像静态类型和更好的缓存那样引人注目,但它们仍然是一个坚实的胜利。
![?](http://img1.sycdn.imooc.com/54586431000103bb02200220-100-100.jpg)
TA贡献1805条经验 获得超9个赞
这是解决你问题的方法。这都是矢量化的。
In [58]: df = table1.merge(table2,on='letter')
In [59]: df['calc'] = df['number1']*df['number2']
In [60]: df
Out[60]:
letter number1 number2 calc
0 a 50 0.2 10
1 a 50 0.5 25
2 b -10 0.1 -1
3 b -10 0.4 -4
In [61]: df.groupby('letter')['calc'].max()
Out[61]:
letter
a 25
b -1
Name: calc, dtype: float64
In [62]: df.groupby('letter')['calc'].idxmax()
Out[62]:
letter
a 1
b 2
Name: calc, dtype: int64
In [63]: df.loc[df.groupby('letter')['calc'].idxmax()]
Out[63]:
letter number1 number2 calc
1 a 50 0.5 25
2 b -10 0.1 -1
添加回答
举报