1. 程式人生 > 其它 >pandas模組高效能使用方法總結

pandas模組高效能使用方法總結

pandas處理起來大批量資料是很方便的,本文主要是根據自己的工作經驗總結一下pandas裡不同迴圈方法的優劣

import pandas as pd
import numpy as np

初級:for迴圈

#for 迴圈主要是把df表格拆分成一行一行的遍歷主要有3種方法
df1 = pd.DataFrame(
    {'a':list(range(0,10)),
     'b':list(range(10,20)),
     'c':list(range(20,30))}
)
for index,row in df1.iterrows():
    index
    row
for tup in df1.itertuples():
    tup
#這兩種迴圈方式和普通的python迴圈可迭代物件的方法沒什麼區別,只不過得到的資料型別是pandas相關的資料型別
#該種方法執行速度最慢,一般不建議使用

中級:apply

#除了apply還有map,agg等方法
#apply方法是針對pandas的資料結構優化過的,使用方式最為靈活,apply的函式可以是系統自帶的聚合函式,或是簡單的lambda函式,
#也可以是複雜的自定義函式,具體的使用方法不多做贅述

#當需要對資料分組然後運用自定義函式時可以先寫成for迴圈的形式,方便除錯邏輯,當邏輯測試沒問題之後,再把迴圈邏輯單獨寫到一個函式裡,
#簡單舉例
def func(df,x):
    return df+x
res = df1.groupby('a').apply(func,1)

#func可以繼續再呼叫函式,可以無限套娃
#apply的優點還是很明顯的,如果被呼叫的函式不是很複雜或則資料量不大情況下

#如果一個df的分組有上百萬資料,而且每個分組的函式又呼叫了大量其他的函式進行計算密集型的操作,
#此時單純的使用apply已經不能夠滿足效能要求了,因為你的計算是序列的,至於為什麼請自行搜尋GIL全域性直譯器鎖

高階:多程序

#為啥不開多執行緒要開多程序,在python中,計算密集型的任務開了多執行緒沒啥效果,具體原因還請自行搜尋GIL全域性直譯器鎖
#回到業務情景,資料量大,計算密集,此時需要讓多個cpu工作起來同時計算
#下面簡單介紹3中平行計算的方式

#3.1使用multiprocessing.Pool模組,不建議使用
from multiprocessing import Pool
df_parts = np.array_split(df,8)
with Pool(process=8,initializer=inti_func,initargs=(args,)) as pool:
    result_df = pool.map(func,df_parts)
res_df = pd.concat(result_df)

#3.2使用concurrent.futures.ProcessPoolExecutor模組,建議使用
from concurrent.futures import ProcessPoolExecutor
res = []
def _callback():
    res.append(r.result())
pool = ProcessPoolExecutor(8)
for task in task_lists:
    res_df = pool.submit(func,params).add_done_callback(_callback)
pool.shutdown(wait=True)

#3.3使用joblib模組,不建議使用
from joblib import Parallel,delayed
df_group = df.groupby('id')
result = Parallel(n_jobs=8)(delayed(func)(id,df_group) for id,p_df in df_group)
result_df = pd.concat(result)

#這些模組開啟多程序的具體方法見後續更新