将组中具有特定值的所有行排序到组中的最后一个位置

问题描述 投票:0回答:2

我尝试将组中具有特定值的所有行排序到每个组中的最后一个位置。

data = {'a':[1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3],
        'b':[100, 300, 200, 222, 500, 300, 222, 100, 200, 222, 300, 500, 400, 100],
        'c':[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]}
df1 = pd.DataFrame(data)
df1

Out[29]: 
    a    b   c
0   1  100   1
1   1  300   2
2   1  200   3
3   1  222   4
4   1  500   5
5   2  300   6
6   2  222   7
7   2  100   8
8   3  200   9
9   3  222  10
10  3  300  11
11  3  500  12
12  3  400  13
13  3  100  14

should be:

Out[31]: 
    a    b   c
0   1  100   1
1   1  300   2
2   1  200   3
3   1  500   5
4   1  222   4
5   2  300   6
6   2  100   8
7   2  222   7
8   3  200   9
9   3  300  11
10  3  500  12
11  3  400  13
12  3  100  14
13  3  222  10

我的尝试之一是:

df1 = df1['b'].eq[222].sort(position='last').groupby(df1['a'])

但是我还没有找到解决办法

python pandas dataframe sorting group-by
2个回答
0
投票

用途:

out = (df1.sort_values('b', key = lambda x: x==222)
          .sort_values('a', ignore_index=True, kind='stable'))
print (out)
    a    b   c
0   1  100   1
1   1  300   2
2   1  200   3
3   1  500   5
4   1  222   4
5   2  300   6
6   2  100   8
7   2  222   7
8   3  200   9
9   3  300  11
10  3  500  12
11  3  400  13
12  3  100  14
13  3  222  10

0
投票

尝试使用临时列:

import pandas as pd

data = {
    'a': [1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3],
    'b': [100, 300, 200, 222, 500, 300, 222, 100, 200, 222, 300, 500, 400, 100],
    'c': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
}
df = pd.DataFrame(data)

sorted_df = (df.assign(temp=lambda x: x['b'] == 222)
               .sort_values(by=['a', 'temp', 'c'], ascending=[True, True, True])
               .drop(columns='temp')
               .reset_index(drop=True))
print(sorted_df)

输出:

    a    b   c
0   1  100   1
1   1  300   2
2   1  200   3
3   1  500   5
4   1  222   4
5   2  300   6
6   2  100   8
7   2  222   7
8   3  200   9
9   3  300  11
10  3  500  12
11  3  400  13
12  3  100  14
13  3  222  10
© www.soinside.com 2019 - 2024. All rights reserved.