2

我有一个熊猫数据框,例如:

  ID  Group   Rank include 
  1   Group1  1    0     
  2   Group1  2    1     
  3   Group1  3    0     
  4   Group1  4    1     
  5   Group2  1    0     
  6   Group2  2    0     
  7   Group2  3    1    
  8   Group2  4    1     
  9   Group2  5    1      

我想选择一个满足以下条件的子集: - 组中最多 3 行 - 包括包含 = 1 的所有行(每组不超过 3 个) - 最小化每组的总排名

基本上,我想从每个组中选择 TOP "N" 记录,但是 include=1 的行优先于其余行。

输出数据帧:

  ID  Group   Rank include 
  1   Group1  1    0     
  2   Group1  2    1       
  4   Group1  4    1         
  7   Group2  3    1    
  8   Group2  4    1     
  9   Group2  5    1

我尝试了几种方法,但都没有真正奏效,现在我被卡住了。
请帮忙!

4

1 回答 1

2

首先按您的条件对数据框进行排序:

df.sort_values(['include', 'Rank'], ascending=[False, True], inplace=True)

然后 groupbyGroup并获取每个组的前 3 行。另外,添加 asort_values以对最终数据框进行排序 on Groupthen on Rank,如下所示:

df.groupby('Group').head(3).sort_values(['Group', 'Rank'])

输出:

   ID   Group  Rank  include
0   1  Group1     1        0
1   2  Group1     2        1
3   4  Group1     4        1
6   7  Group2     3        1
7   8  Group2     4        1
8   9  Group2     5        1
于 2018-04-29T12:10:08.377 回答