示例数据:
mdf = pd.DataFrame([[1,2,50],[1,2,20],
[1,5,10],[2,8,80],
[2,5,65],[2,8,10]
], columns=['src','dst','n']); mdf
src dst n
0 1 2 50
1 1 2 20
2 1 5 10
3 2 8 80
4 2 5 65
5 2 8 10
groupby()
提供了一个两级多指数:
test = mdf.groupby(['src','dst'])['n'].agg(['sum','count']); test
sum count
src dst
1 2 70 2
5 10 1
2 5 65 1
8 90 2
问题:如何按src
升序然后按sum
降序对此DataFrame进行排序?
我是pandas的初学者,了解了sort_index()和sort_values(),但在这项任务中我似乎需要同时进行。
预期结果,在每个" src"排序由" sum":
决定 sum count
src dst
1 2 70 2
5 10 1
2 8 90 2
5 65 1
答案 0 :(得分:3)
IIUC:
In [29]: test.sort_values('sum', ascending=False).sort_index(level=0)
Out[29]:
sum count
src dst
1 2 80 2
5 10 1
2 8 80 1
更新:与@anonyXmous's solution非常相似:
In [47]: (test.reset_index()
.sort_values(['src','sum'], ascending=[1,0])
.set_index(['src','dst']))
Out[47]:
sum count
src dst
1 2 70 2
5 10 1
2 8 90 2
5 65 1
答案 1 :(得分:3)
您可以重置索引,然后按所选列对其进行排序。希望这会有所帮助。
import pandas as pd
mdf = pd.DataFrame([[1,2,50],[1,2,20],
[1,5,10],[2,8,80],
[2,5,65],[2,8,10]
], columns=['src','dst','n']);
mdf = mdf.groupby(['src','dst'])['n'].agg(['sum','count']);
mdf.reset_index(inplace=True)
mdf.sort_values(['src', 'sum'], ascending=[True, False], inplace=True)
print(mdf)
Result:
src dst sum count
0 1 2 70 2
1 1 5 10 1
3 2 8 90 2
2 2 5 65 1
答案 2 :(得分:2)
如果其他人也使用google遇到此问题。从pandas 0.23版开始,您可以将级别名称作为参数传递给sort_values
:
test.sort_values(['src','sum'], ascending=[1,0])
Result:
sum count
src dst
1 2 70 2
5 10 1
2 8 90 2
5 65 1