I would like to replace the following syntax with a cleaner, chained syntax – perhaps using .pipe
(similar to dplyr
library in R):
Sample dataset:
dt = pd.DataFrame({ "PACK_STR": ['112', '112', '112', '134', '145', '134'], "FLAG_MODE_SUM_PCK": [1, 0, 1, 1, 1, 0] })
Code to replace by piping:
packs_mode_sum_pck = dt.groupby(['PACK_STR']).FLAG_MODE_SUM_PCK.sum().reset_index().rename(columns={'FLAG_MODE_SUM_PCK':'OCCUR_MODE_SUM_PCK'}) dt = dt.merge(packs_mode_sum_pck, how="left", on='PACK_STR')
Expected output:
PACK_STR FLAG_MODE_SUM_PCK OCCUR_MODE_SUM_PCK 0 112 1 2 1 112 0 2 2 112 1 2 3 134 1 1 4 145 1 1 5 134 0 1
Advertisement
Answer
Here are two elegant ways to get your output:
def ssum(grp): grp['OCCUR_MODE_SUM_PCK'] = grp['FLAG_MODE_SUM_PCK'].sum() return grp dt.groupby('PACK_STR').apply(ssum)
or
dt['OCCUR_MODE_SUM_PCK'] = dt.groupby('PACK_STR')['FLAG_MODE_SUM_PCK'].transform(sum) dt