python pandas select top' n'来自多个子组

时间:2018-03-17 07:13:46

标签: python pandas pandas-groupby

我有一个DataFrame,可以说是3列:

col1 | col2 | col3
A | x | p
A | x | q
A | x | r
A | x | r
A | y | s
A | y | t
A | z | u
B | x | q
B | x | r
B | y | t

我想根据3列&的唯一组合的出现次数对此进行分组。然后只选择col3

的前2(n)值的记录

因此,如果(A,x)的组合具有9个p计数,则计数8个q&在col3中有3个r计数 - 那么它应该只显示col3的前2个计数:

A | x | p | 9
A | x | q | 8

我已经尝试过nighgest,head&来自其他论坛的其他一些选项,但它们都不适用于子组 - 它们只显示整个组的前n个

1 个答案:

答案 0 :(得分:1)

我认为groupby需要value_countshead需要groupby一级和二级:

df1 = (df.groupby(['col1','col2'])['col3']
         .value_counts()
         .groupby(level=[0,1])
         .head(2)
         .reset_index(name='count'))
print (df1)
  col1 col2 col3  count
0    A    x    p      9
1    A    x    q      8
2    A    y    s      1
3    A    y    t      1
4    A    z    u      1
5    B    x    q      1
6    B    x    r      1
7    B    y    t      1

<强>详细

print (df.groupby(['col1','col2'])['col3'].value_counts())
col1  col2  col3
A     x     p       9
            q       8
            r       3
      y     s       1
            t       1
      z     u       1
B     x     q       1
            r       1
      y     t       1
Name: col3, dtype: int64

<强>设置

d = {'col1': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B'], 'col2': ['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'y', 'y', 'z', 'x', 'x', 'y'], 'col3': ['p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'r', 'r', 'r', 's', 't', 'u', 'q', 'r', 't']}
df = pd.DataFrame(d)
print (df)
   col1 col2 col3
0     A    x    p
1     A    x    p
2     A    x    p
3     A    x    p
4     A    x    p
5     A    x    p
6     A    x    p
7     A    x    p
8     A    x    p
9     A    x    q
10    A    x    q
11    A    x    q
12    A    x    q
13    A    x    q
14    A    x    q
15    A    x    q
16    A    x    q
17    A    x    r
18    A    x    r
19    A    x    r
20    A    y    s
21    A    y    t
22    A    z    u
23    B    x    q
24    B    x    r
25    B    y    t