3 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
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貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超4個(gè)贊
攤銷(xiāo)式查找
:Python是一種動(dòng)態(tài)類型化語(yǔ)言,因此數(shù)組中的每個(gè)元素都有運(yùn)行時(shí)開(kāi)銷(xiāo)。然而,Numpy(因此也是熊貓)用C進(jìn)行計(jì)算(通常是通過(guò)Cython)。數(shù)組的類型只有在迭代開(kāi)始時(shí)才能確定;僅這一節(jié)省就是最大的勝利之一。 更好的緩存
在C數(shù)組上迭代是對(duì)緩存友好的,因此非???。熊貓DataFrame是一個(gè)“面向列的表”,這意味著每個(gè)列實(shí)際上只是一個(gè)數(shù)組。因此,您可以在DataFrame上執(zhí)行的本機(jī)操作(比如對(duì)列中的所有元素進(jìn)行求和)將很少有緩存丟失。 更多并行的機(jī)會(huì)
一個(gè)簡(jiǎn)單的C數(shù)組可以通過(guò)SIMD指令操作。Numpy的某些部分支持SIMD,這取決于您的CPU和安裝過(guò)程。并行化的好處不會(huì)像靜態(tài)類型和更好的緩存那樣引人注目,但它們?nèi)匀皇且粋€(gè)堅(jiān)實(shí)的勝利。

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超9個(gè)贊
這是解決你問(wèn)題的方法。這都是矢量化的。
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
添加回答
舉報(bào)