在熊猫中按列子值排序



我的熊猫数据帧看起来像这样:

---------------------------------------
Name   | Stats                     
---------------------------------------
Bob    | { age : 42, profession: IT }
Jill   | { age : 35, profession: Engineer }
Patric | { age : 37, profession: Student }
---------------------------------------

其中Stats是一个类,ageprofession都是该类的属性。

我想按Stats上的一个属性对该表进行排序。例如,按人员的年龄对其进行排序,使表如下所示:

---------------------------------------
Name   | Stats                     
---------------------------------------
Jill   | { age : 35, profession: Engineer }
Patric | { age : 37, profession: Student }
Bob    | { age : 42, profession: IT }
---------------------------------------

有没有办法用熊猫做到这一点?我只找到了按整列排序的方法

谢谢

解决方案
您可以使用argsort查找适当的排序并将其传递给iloc。 但是,您需要创建一个数据帧才能在age列上运行argsort

df.iloc[pd.DataFrame(df.Stats.values.tolist()).age.argsort()]
Name                                  Stats
1    Jill  {'age': 35, 'profession': 'Engineer'}
2  Patric   {'age': 37, 'profession': 'Student'}
0     Bob        {'age': 42, 'profession': 'IT'}

看完@Alexander的回答...我想出了一些结合他的想法和我的想法的东西。 如果有人觉得这部分有用,请不要忘记对他的回答投赞成票。

df.iloc[np.argsort([x.get('age') for x in df.Stats])]

定时
小样本数据

%timeit df.iloc[pd.DataFrame(df.Stats.values.tolist()).age.argsort()]
%timeit df.iloc[np.argsort([x.get('age') for x in df.Stats])]
%timeit df.iloc[np.argsort([x.get('age') for x in df.Stats.values.tolist()])]
1000 loops, best of 3: 756 µs per loop
1000 loops, best of 3: 225 µs per loop
1000 loops, best of 3: 207 µs per loop

设置

df = pd.DataFrame(dict(
Name='Bob Jill Patric'.split(),
Stats=[
dict(age=42, profession='IT'),
dict(age=35, profession='Engineer'),
dict(age=37, profession='Student')
]
))

使用数据帧的一个要点是键入列以实现高效的存储和计算速度(例如 int64、float64、object 等(。 您的数据结构不佳;您可能应该为Stats中的每个字段设置单独的列。 有关详细信息,请参阅整洁数据。

df2 = df[['Name']].assign(age=[d.get('age') for d in df['Stats']],
profession=[d.get('profession') for d in df['Stats']])

然后,可以轻松处理您的数据。

>>> df2.sort_values('age')
Name  age profession
1    Jill   35   Engineer
2  Patric   37    Student
0     Bob   42         IT

最新更新