根据特定列对列进行排序| python |大熊猫

时间:2018-08-22 21:14:17

标签: python pandas sorting group-by

我有一个这样的数据框:

c234  0.4255  0.2348  0.4255
c234  0.876   0.456   0.876
c561  0.9527  0.263   0.9527
c561  0.4111  0.1543  0.4111
c561  0.8231  0.975   0.975

我想在每个4th column中对1st column进行排序,输出将如下所示:

c234  0.876   0.456   0.876
c234  0.4255  0.2348  0.4255
c561  0.8231  0.975   0.975
c561  0.9527  0.263   0.9527
c561  0.4111  0.1543  0.4111

请帮忙吗?

2 个答案:

答案 0 :(得分:3)

使用sort_valuesascending作为布尔值列表来确定方向:

df.sort_values([0,3], ascending=[True, False])

输出:

      0       1       2       3
1  c234  0.8760  0.4560  0.8760
0  c234  0.4255  0.2348  0.4255
4  c561  0.8231  0.9750  0.9750
2  c561  0.9527  0.2630  0.9527
3  c561  0.4111  0.1543  0.4111

答案 1 :(得分:2)

sort_values获取列列表

假设您的列名是[0, 1, 2, 3]

df.sort_values([0, 3], ascending=[True, False])

      0       1       2       3
1  c234  0.8760  0.4560  0.8760
0  c234  0.4255  0.2348  0.4255
4  c561  0.8231  0.9750  0.9750
2  c561  0.9527  0.2630  0.9527
3  c561  0.4111  0.1543  0.4111

保留行的位置

假设第一列未排序,并且您不希望对其进行排序。您只希望对每个组中的行进行排序。

df.loc[
    df.groupby(0)[3].transform(
        lambda x: x.sort_values(ascending=False).index
    ).astype(df.index.dtype)
]

      0       1       2       3
1  c234  0.8760  0.4560  0.8760
0  c234  0.4255  0.2348  0.4255
4  c561  0.8231  0.9750  0.9750
2  c561  0.9527  0.2630  0.9527
3  c561  0.4111  0.1543  0.4111

但这并不有趣。假设数据框是这个

      0       1       2       3
0  c561  0.9527  0.2630  0.9527
1  c234  0.4255  0.2348  0.4255
2  c234  0.8760  0.4560  0.8760
3  c561  0.4111  0.1543  0.4111
4  c561  0.8231  0.9750  0.9750

请注意,'c561'位于顶部,底部位于更多位置。我们可以对其进行排序,并保持相同的行位置。让我们再次运行最后一个解决方案。

      0       1       2       3
4  c561  0.8231  0.9750  0.9750
2  c234  0.8760  0.4560  0.8760
1  c234  0.4255  0.2348  0.4255
0  c561  0.9527  0.2630  0.9527
3  c561  0.4111  0.1543  0.4111