Python 3.x 熊猫如何通过标志栏获得前n组

Python 3.x 熊猫如何通过标志栏获得前n组,python-3.x,pandas,Python 3.x,Pandas,我有如下数据帧 df = pd.DataFrame({'group':[1,2,1,3,3,1,4,4,1,4], 'match': [1,1,1,1,1,1,1,1,1,1]}) group match 0 1 1 1 2 1 2 1 1 3 3 1 4 3 1 5 1 1 6 4 1 7 4 1 8 1

我有如下数据帧

df = pd.DataFrame({'group':[1,2,1,3,3,1,4,4,1,4], 'match': [1,1,1,1,1,1,1,1,1,1]})

   group  match
0      1      1
1      2      1
2      1      1
3      3      1
4      3      1
5      1      1
6      4      1
7      4      1
8      1      1
9      4      1
我想得到前n组,如下所示(n=3)

我的数据,实际上,每一行都有另一个信息要使用,所以只排序到匹配的num,并提取前n


如何做到这一点?

我相信如果需要,您需要每列top3组
匹配
-使用for for top3 per groups,然后通过和将索引转换为数据帧:

或者如果
match
1
仅需要筛选值,则使用以下方法进行筛选:

具有
isin
和有序类别的解决方案:

#if need filter match == 1
idx = df.loc[df['match'] == 1, 'group'].value_counts().head(3).index
#if dont need filter
#idx = df.group.value_counts().head(3).index
df = df[df.group.isin(idx)]

df['group'] = pd.CategoricalIndex(df['group'], ordered=True, categories=idx)

df = df.sort_values('group')
print (df)
  group  match
0     1      1
2     1      1
5     1      1
8     1      1
6     4      1
7     4      1
9     4      1
3     3      1
4     3      1
解决方案的差异在
match
列的更改数据中最为明显:

df = pd.DataFrame({'group':[1,2,1,3,3,1,4,4,1,4,10,20,10,20,10,30,40], 
                   'match': [1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0]})

print (df)
    group  match
0       1      1
1       2      1
2       1      1
3       3      1
4       3      1
5       1      1
6       4      1
7       4      1
8       1      1
9       4      1
10     10      0
11     20      0
12     10      0
13     20      0
14     10      0
15     30      0
16     40      0
按匹配项列出的每组前三名值:

s = df.groupby('match')['group'].value_counts().groupby(level=0).head(3).swaplevel()
df1 = s.index.to_frame().reset_index(drop=True).merge(df)
print (df1)
    group  match
0      10      0
1      10      0
2      10      0
3      20      0
4      20      0
5      30      0
6       1      1
7       1      1
8       1      1
9       1      1
10      4      1
11      4      1
12      4      1
13      3      1
14      3      1
按匹配项排列的前三名值==1:

s = df.loc[df['match'] == 1, 'group'].value_counts().head(3)

df2 = s.index.to_frame(name='group').merge(df)
print (df2)
   group  match
0      1      1
1      1      1
2      1      1
3      1      1
4      4      1
5      4      1
6      4      1
7      3      1
8      3      1
Top3值,
匹配
列不重要:

s = df['group'].value_counts().head(3)
df3 = s.index.to_frame(name='group').merge(df)
print (df3)
   group  match
0      1      1
1      1      1
2      1      1
3      1      1
4     10      0
5     10      0
6     10      0
7      4      1
8      4      1
9      4      1

您的问题不清楚,这里的前n组是什么?计算“组,计数”,组1:4次,组4:3次,组3:2次,组2:1times@anky_91-嗯,我想是的,因为如果多索引存在匹配两个级别的问题,那么您的第一个解决方案有效!但是第二个解决方案是raise TypeError:to_frame()得到了一个意外的关键字参数'name'。对不起,也许我的熊猫已经老了。(0.23.4)@rootpetit-是的,你是对的,需要
s.index.将_axis('group')重命名为_frame()
而不是
s.index.to _frame(name='group')
pd.DataFrame({group':s.index})
s = df.groupby('match')['group'].value_counts().groupby(level=0).head(3).swaplevel()
df1 = s.index.to_frame().reset_index(drop=True).merge(df)
print (df1)
    group  match
0      10      0
1      10      0
2      10      0
3      20      0
4      20      0
5      30      0
6       1      1
7       1      1
8       1      1
9       1      1
10      4      1
11      4      1
12      4      1
13      3      1
14      3      1
s = df.loc[df['match'] == 1, 'group'].value_counts().head(3)

df2 = s.index.to_frame(name='group').merge(df)
print (df2)
   group  match
0      1      1
1      1      1
2      1      1
3      1      1
4      4      1
5      4      1
6      4      1
7      3      1
8      3      1
s = df['group'].value_counts().head(3)
df3 = s.index.to_frame(name='group').merge(df)
print (df3)
   group  match
0      1      1
1      1      1
2      1      1
3      1      1
4     10      0
5     10      0
6     10      0
7      4      1
8      4      1
9      4      1