我有一个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个
答案 0 :(得分:1)
我认为groupby
需要value_counts
,head
需要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