Pandas基于其他列值对数据帧进行排序

时间:2014-12-16 12:15:44

标签: python sorting pandas

我有这个已排序的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)个值

1 个答案:

答案 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

我想你可以很容易地把它变成一个应用于数据帧的函数。