5 個 Pandas 超級好用的隱藏技巧
對于數(shù)據(jù)科學(xué)來說,Python 中最重要的庫是什么?有些人可能認(rèn)為是 scikit-learn,它提供了許多內(nèi)置函數(shù)用于機(jī)器學(xué)習(xí)任務(wù)。部分人可能會選擇 NumPy 進(jìn)行數(shù)值運(yùn)算。
但我還是支持 Pandas。為什么?如果你不使用它的功能,你的操作可能會寸步難行。Pandas 非常龐大,需要學(xué)習(xí)的東西很多。
在本文中,分享五個鮮為人知的 Pandas 技巧。這些技巧初時對我來說非常新穎,需要經(jīng)過大量研究才能掌握。
1. pipe() 方法鏈
.pipe() 方法鏈可以使代碼更簡潔、更高效。使用.pipe(),可以在一行中應(yīng)用多個操作。
下面,我們將篩選市場價值高于 1,000,000 歐元的球員數(shù)據(jù),并按排序market_value_in_eur,找出世界上最昂貴的球員。
# 這個 transfermarkt 數(shù)據(jù)集來自 Kaggle(https://www.kaggle.com/datasets/davidcariboo/player-scores)
def filter_high_value_players ( df ):
return df[df[ 'market_value_in_eur' ] > 1000000 ]
def sort_by_market_value ( df ):
return df.sort_values( 'market_value_in_eur' , accending= False )
# 使用 .pipe() 進(jìn)行方法鏈
filtered_sorted_df = df.pipe(filter_high_value_players).pipe(sort_by_market_value)
2. query()簡化過濾
該query()方法使得過濾數(shù)據(jù)幀更加容易。無需使用長條件,query()使代碼更具可讀性。
在這里,我們嘗試尋找身價 5000 萬歐元且身高超過 185 歲的足球運(yùn)動員。
high_value_players_2022 = df2.query("market_value_in_eur > 50000000 和 height_in_cm == 185")
high_value_players_2022.head(5)
3. eval()加速計(jì)算
該eval()函數(shù)可以為算術(shù)運(yùn)算提速,特別是對于列式計(jì)算非常有用。
# 使用 eval() 計(jì)算百萬市值
df[ 'market_value_in_millions' ] = df.eval ( 'market_value_in_eur / 1_000_000' )
# 刪除 na df.dropna (
subset=[ 'market_value_in_millions' ], inplace= True )
# 從最高到最低升序
df.sort_values( "market_value_in_millions" , accending = False )[[ "name" , "market_value_in_millions" ]]
4. astype()優(yōu)化數(shù)據(jù)類型
將列轉(zhuǎn)換為Categorical數(shù)據(jù)類型可以節(jié)省內(nèi)存并加快操作,并且如果在為機(jī)器學(xué)習(xí)算法處理數(shù)據(jù)時,這是該方法將是你最佳選擇。
# 將 'player_club_domestic_competition_id' 轉(zhuǎn)換為分類
df [ 'player_club_domestic_competition_id' ] = df [ 'player_club_domestic_competition_id' ].astype( 'category' )
5. assign()臨時添加列
對于于臨時更改數(shù)據(jù)列,可以使用assign()方法添加新列而不修改原始數(shù)據(jù)。
在這里可以看到球員的價值是否高于平均水平。
# 使用assign()添加一列,表示市場價值是否高于平均水平
df_with_new_col = df.assign(above_average = df[ 'market_value_in_millions' ] > df[ 'market_value_in_millions' ].mean())
df_with_new_col.head()
圖片