提问人:Hack-R 提问时间:10/12/2017 最后编辑:Hack-R 更新时间:10/12/2017 访问量:40
按最小索引号对 Pandas 数据帧组进行排序,然后根据第 3 列对组内的所有其他列重新排序
Order Pandas dataframe groups by minimum index number, then re-order all other columns within groups based on a 3rd column
问:
我有一个这样的数据帧:
import numpy as np
import pandas as pd
columns=['Order', 'Group_code', 'Grade', 'Contextual_info']
data = np.array([np.arange(6)]*4).T
mydf = pd.DataFrame(data, columns=columns)
mydf.Order = [1,2,3,4,5,6]
mydf.Group_code = ['group99','group2','group2','group2','group12','group12']
mydf.Grade = [80,0,60,80,85,70]
mydf.Contextual_info = [5,4,3,2,1,0]
mydf
Order Group_code Grade Contextual_info 0 1 group99 80 5 1 2 group2 0 4 2 3 group2 60 3 3 4 group2 80 2 4 5 group12 85 1 5 6 group12 70 0
这是由 .我想保留 by 的顺序,因此 中的列值不应更改。Order
Group_code
Order
Group_code
但是,在每个组中,我想按 的降序排列行。最后,我将用一个新的整数向量 1 替换......n,因此在本例中它仍然是 1、2、3、4、5、6。Group_code
Grade
Order
期望的结果:
Order Group_code Grade Contextual_info 1 group99 80 5 2 group2 80 2 3 group2 60 3 4 group2 0 4 5 group12 85 1 6 group12 70 0
答:
2赞
Zero
10/12/2017
#1
用
In [677]: mydf.Grade = (mydf.groupby('Group_code')['Grade']
.transform(pd.Series.sort_values, ascending=False))
In [678]: mydf
Out[678]:
Order Group_code Grade 0 1 group99 80 1 2 group2 80 2 3 group2 60 3 4 group2 0 4 5 group12 85 5 6 group12 70
评论
0赞
Bharath M Shetty
10/12/2017
我认为更简单的一个是mydf.Grade = mydf.groupby('Group_code')['Grade'].transform(sorted,reverse=True)
0赞
Hack-R
10/12/2017
这太棒了。有一种方法我可能过于简化了这一点。我正在尝试对数据帧进行排序,而不仅仅是一列。这可能不清楚,因为这个例子太少了。在现实世界中,还有许多其他列也应该进行排序。为此调整这个容易吗?我只是调整了示例以使其更清楚。
评论