I have a data-frame containing following structure

    **Email             MAC**                   
    [email protected]    AA:AA:AA:AA:A1      
    [email protected]    AA:AA:AA:AA:A5      
    [email protected]    PP:PP:PP:PP:P5
    [email protected]    PP:PP:PP:PP:P6
    [email protected]    AA:AA:AA:AA:A2
    [email protected]    AA:AA:AA:AA:A9

I have to settle them into

**Email             MAC1                    MAC2                        MAC3**
[email protected]    AA:AA:AA:AA:A1      AA:AA:AA:AA:A5              PP:PP:PP:PP:P5
[email protected]    AA:AA:AA:AA:A2      AA:AA:AA:AA:A9              Null

The value PP:PP:PP:PP:P6 corresponding to [email protected] has been discarded as it exceeds the number of allowed columns(only first 3 values are allowed).

1 Answers

jezrael On Best Solutions

Use GroupBy.cumcount for counter column, filter by boolean indexing, reshape by DataFrame.set_index with DataFrame.unstack:

N = 3
g = df.groupby('Email').cumcount().add(1)
df = df[g <= N]
df1 = df.set_index(['Email',g[g<=N]])['MAC'].unstack().add_prefix('MAC').reset_index()
print (df1)
              Email            MAC1            MAC2            MAC3
0  [email protected]  AA:AA:AA:AA:A1  AA:AA:AA:AA:A5  PP:PP:PP:PP:P5
1  [email protected]  AA:AA:AA:AA:A2  AA:AA:AA:AA:A9             NaN