我有这个已排序的Pandas数据帧df
。
我使用df = df.sort(col_a,col_b)
col_a col_b
a 6
a 7
a 8
a 11
b 5
b 10
b 12
c 11
c 13
c 14
但我会根据df
最小值和最大值对col_b
进行排序,以使col_a
值具有最小col_b
值并且在最后一个位置col_a
值的最大值为col_b
:
col_a col_b
b 5
b 10
b 12
a 6
a 7
a 8
a 11
c 11
c 13
c 14
有没有一种快速的方法可以使用熊猫的功能进行这种排序?
编辑1:
@Primer解决方案适用于2列df
。
使用此df
col_a col_b col_c
0 a 6 9
1 a 7 8
2 a 8 7
3 a 11 6
4 b 5 5
5 b 10 4
6 b 12 3
7 c 11 2
8 c 13 1
9 c 14 0
返回
ValueError: Wrong number of items passed 2, placement implies 1
编辑2
d = {'col_a' : ['a','a','a','a','b','b','c','c','c'],
'col_b' :[6,7,8,11,12,13,11,13,14],
'col_c' :[9,8,7,6,5,4,3,2,1]
}
df = DataFrame(d)
返回:
col_a col_b col_c
0 a 6 9
1 a 7 8
2 a 8 7
3 a 11 6
4 b 12 5
5 b 13 4
6 c 11 3
7 c 13 2
8 c 14 1
@Primer Whit df
你的代码没有工作,因为它返回:
col_a col_b col_c
0 a 6 9
1 a 7 8
2 a 8 7
3 a 11 6
4 c 11 3
5 c 13 2
6 c 14 1
7 b 12 5
8 b 13 4
我需要
col_a col_b col_c
0 a 6 9
1 a 7 8
2 a 8 7
3 a 11 6
4 b 12 5
5 b 13 4
6 c 11 3
7 c 13 2
8 c 14 1
因为c
组有max(value)=14
,而您的代码需要max(min)
个值
答案 0 :(得分:2)
你可以这样做:
df['min'] = df.groupby('col_a')['col_b'].transform(lambda x: x.min())
df = df.sort(['min', 'col_a', 'col_b']).reset_index(drop=True).drop('min', 1)
df
哪个收益率:
col_a col_b
0 b 5
1 b 10
2 b 12
3 a 6
4 a 7
5 a 8
6 a 11
7 c 11
8 c 13
9 c 14
编辑:
我修复了上面的代码,以确保transform
用于系列而不是数据框(从而避免错误)。
让我回来:
col_a col_b col_c
0 b 5 5
1 b 10 4
2 b 12 3
3 a 6 9
4 a 7 8
5 a 8 7
6 a 11 6
7 c 11 2
8 c 13 1
9 c 14 0
我想你可以很容易地把它变成一个应用于数据帧的函数。