3 回答

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
.

TA貢獻1851條經驗 獲得超4個贊
攤銷式查找
:Python是一種動態類型化語言,因此數組中的每個元素都有運行時開銷。然而,Numpy(因此也是熊貓)用C進行計算(通常是通過Cython)。數組的類型只有在迭代開始時才能確定;僅這一節省就是最大的勝利之一。 更好的緩存
在C數組上迭代是對緩存友好的,因此非常快。熊貓DataFrame是一個“面向列的表”,這意味著每個列實際上只是一個數組。因此,您可以在DataFrame上執行的本機操作(比如對列中的所有元素進行求和)將很少有緩存丟失。 更多并行的機會
一個簡單的C數組可以通過SIMD指令操作。Numpy的某些部分支持SIMD,這取決于您的CPU和安裝過程。并行化的好處不會像靜態類型和更好的緩存那樣引人注目,但它們仍然是一個堅實的勝利。

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
添加回答
舉報