分组并获取除前5名以外的所有行

时间:2019-08-07 15:14:28

标签: python pandas pandas-groupby

按一列分组,并获得除前5名以外的那些组的所有行。

这样做是为了获得每个组的前5行

x = pd.DataFrame({'A': ['p', 'p','p','p','p','p','p','p', 'q', 'q', 'q', 'q', 'q', 'q'], 'B' : [3,5,4,7,10,2,3,7,1,4,9,9,2,5]})
x = x.sort_values(by = 'Total', ascending = False).groupby(['Identifier']).head(5)

我希望该组的所有行(前5名除外)

所需结果:

A B

p 3

p 3

p 2

q 1

3 个答案:

答案 0 :(得分:1)

使用pd.iloc[5:]

df = pd.DataFrame({'A': ['p', 'p','p','p','p','p','p','p', 'q', 'q', 'q', 'q', 'q'], 'B' : [3,5,4,7,10,2,3,7,1,4,9,9,2]})
df=df.sort_values(by = 'B', ascending = False)

输出:

    A   B
4   p   10
10  q   9
11  q   9
3   p   7
7   p   7
1   p   5
2   p   4
9   q   4
0   p   3
6   p   3
5   p   2
12  q   2
8   q   1

df.iloc[5:]

输出:

    A   B
1   p   5
2   p   4
9   q   4
0   p   3
6   p   3
5   p   2
12  q   2
8   q   1

答案 1 :(得分:0)

您可以尝试以下方法:

(x.sort_values('B', ascending=False)
  .groupby('A', as_index=False,
          group_keys=False)
  .apply(lambda x: x.iloc[5:])
)

输出:

   A  B
0  p  3
6  p  3
5  p  2
8  q  1

答案 2 :(得分:0)

可能的解决方案如下:

In  [1]: x = pd.DataFrame(
            {
              'A': ['p', 'p','p','p','p','p','p','p', 'q', 'q', 'q', 'q', 'q', 'q'], 
              'B': [3, 5, 4, 7, 10, 2, 3, 7, 1, 4, 9, 9, 2, 5]
            }
         )
         x = x.sort_values(by=['A', 'B'], ascending=False)
         x['shifted'] = x.groupby(['A'])['B'].shift(5)
         x = x.dropna()[['A', 'B']]
         x

Out [2]:    A   B
         8  q   1 
         0  p   3
         6  p   3
         5  p   2