import multiprocessing
from joblib import Parallel, delayed
def applyParallel(dfGrouped, func):
retLst = Parallel(n_jobs=multiprocessing.cpu_count())(delayed(func)(group) for name, group in dfGrouped)
return pd.concat(retLst)
df_result = applyParallel(df.groupby(['code' 'year']), apply_function)