我尝试将组中具有特定值的所有行排序到每个组中的最后一个位置。
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'])
但是我还没有找到解决办法
用途:
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
尝试使用临时列:
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