如何在数据框的列中对元组进行排序

时间:2018-03-18 13:26:31

标签: python pandas sorting dataframe

我有一个由一列元组组成的数据框,如下所示:

pid         aid                   
0000000F    (0BDEAC61, 288E046F)    
00000017    (7795AF0D, 4A259AFA, 7DA84B6E)  
00000019    (8123B8CF, 3A25A1FE)    
00000025    (28045D98, 8043B6E5, 81195E5D)  
0000003A    (7D566708, 7F5583AE) 

我想对每个元组中的值进行排序,结果如下:

pid         aid                   
0000000F    (0BDEAC61, 288E046F)    
00000017    (4A259AFA, 7795AF0D, 7DA84B6E)  
00000019    (3A25A1FE, 8123B8CF)    
00000025    (28045D98, 8043B6E5, 81195E5D)  
0000003A    (7D566708, 7F5583AE)

我知道我可以逐个循环播放它们并按如下方式排序:

z = list(eval(df.aid.iloc[0]))
z.sort()

但这需要很长时间,因为它是一个巨大的数据帧(超过400万)。有没有更快的方法。

我也尝试过:

df.aid = df.aid.apply(lambda x: list(eval(x)).sort())

但我得到了"None"

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

我认为最简单的是使用list comprehension,如果没有NaN s值:

#import ast
#one possible way for convert string to tuples
#df['aid'] = df['aid'].apply(ast.literal_eval)

print (df['aid'].head().apply(type))
0    <class 'tuple'>
1    <class 'tuple'>
2    <class 'tuple'>
3    <class 'tuple'>
4    <class 'tuple'>
Name: aid, dtype: object

df['aid'] = [tuple(sorted(x)) for x in df['aid']]
print (df)
        pid                             aid
0  0000000F            (0BDEAC61, 288E046F)
1  00000017  (4A259AFA, 7795AF0D, 7DA84B6E)
2  00000019            (3A25A1FE, 8123B8CF)
3  00000025  (28045D98, 8043B6E5, 81195E5D)
4  0000003A            (7D566708, 7F5583AE)

或者:

df['aid'] = df['aid'].apply(sorted)
print (df)
        pid                             aid
0  0000000F            [0BDEAC61, 288E046F]
1  00000017  [4A259AFA, 7795AF0D, 7DA84B6E]
2  00000019            [3A25A1FE, 8123B8CF]
3  00000025  [28045D98, 8043B6E5, 81195E5D]
4  0000003A            [7D566708, 7F5583AE]