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