Sort data in Pandas dataframe alphabetically

Viewed 913

I have a dataframe where I need to sort the contents of one column (comma separated) alphabetically:

ID   Data
1     Mo,Ab,ZZz
2     Ab,Ma,Bt
3     Xe,Aa
4     Xe,Re,Fi,Ab

Output:

ID   Data
1     Ab,Mo,ZZz
2     Ab,Bt,Ma
3     Aa,Xe
4     Ab,Fi,Re,Xe

I have tried:

df.sort_values(by='Data')

But this does not work

5 Answers

You can split, sorting and then join back:

df['Data'] = df['Data'].apply(lambda x: ','.join(sorted(x.split(','))))

Or use list comprehension alternative:

df['Data'] = [','.join(sorted(x.split(','))) for x in df['Data']]

print (df)
   ID         Data
0   1    Ab,Mo,ZZz
1   2     Ab,Bt,Ma
2   3        Aa,Xe
3   4  Ab,Fi,Re,Xe

IIUC get_dummies

s=df.Data.str.get_dummies(',')
df['n']=s.dot(s.columns+',').str[:-1]
df
Out[216]: 
   ID         Data            n
0   1    Mo,Ab,ZZz    Ab,Mo,ZZz
1   2     Ab,Ma,Bt     Ab,Bt,Ma
2   3        Xe,Aa        Aa,Xe
3   4  Xe,Re,Fi,Ab  Ab,Fi,Re,Xe

using explode and sort_values

df["Sorted_Data"] = (
    df["Data"].str.split(",").explode().sort_values().groupby(level=0).agg(','.join)
)

print(df)

   ID         Data  Sorted_Data
0   1    Mo,Ab,ZZz    Ab,Mo,ZZz
1   2     Ab,Ma,Bt     Ab,Bt,Ma
2   3        Xe,Aa        Aa,Xe
3   4  Xe,Re,Fi,Ab  Ab,Fi,Re,Xe

IIUC you can use a list comprehension:

[','.join(sorted(i.split(','))) for i in df['Data']]
#['Ab,Mo,ZZz', 'Ab,Bt,Ma', 'Aa,Xe', 'Ab,Fi,Re,Xe']

Using row iteration:

for index, row in df.iterrows(): 
    row['Data'] = ','.join(sorted(row['Data'].split(','))) 


In [29]: df   
Out[29]:                                                                                                                                                            
          Data
0    Ab,Mo,ZZz
1     Ab,Bt,Ma
2        Aa,Xe
3  Ab,Fi,Re,Xe
Related