我有一个由一列元组组成的数据框,如下所示:
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"
任何帮助都将不胜感激。
答案 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]