df = df.loc[df.index.repeat(df['a'])] df['c'] = df.groupby(level=0).cumcount() + 1 df = df.reset_index(drop=True) print (df) a b c 0 1 x 1 1 2 y 1 2 2 y 2 3 3 z 1 4 3 z 2 5 3 z 3