我有一个具有以下结构的 Pandas DataFrame
file,page_num,val,cls
f1,1,v1,c1
f1,1,v2,c2
f1,1,v3,c2
f1,1,v4,c2 # not required
f1,2,v5,c1
f1,2,v6,c2
f2,1,v7,c1
f2,1,v8,c2
f2,1,v9,c2
f2,1,v10,c2 # not required
f2,2,v11,c1
f2,2,v12,c2
我需要为file<中的每个
。其他(cls)类应保持原样。page_num
找到cls
c2
的前两
行
期望的输出
file,page_num,val,cls
f1,1,v1,c1
f1,1,v2,c2
f1,1,v3,c2
f1,2,v5,c1
f1,2,v6,c2
f2,1,v7,c1
f2,1,v8,c2
f2,1,v9,c2
f2,2,v11,c1
f2,2,v12,c2
我尝试选择除 c2
之外的所有类,然后使用以下命令查找 c2
所需的行。
df = pd.read_csv('sample_f.csv')
df1 = df[df.cls == 'c2'].groupby(['file', 'page_num'])
df2 = df1.apply(lambda x: x.sort_values(['cls']))
df3 = df2.reset_index(drop=True)
df = df.loc[(df.cls !=c2) & (??)]
最佳答案
您可以使用head
与 groupby
,然后与数据帧的其余部分连接,因此假设您需要找到前两个 val
每组:
top_2 = (
df[df['cls'] == 'c2']
.sort_values('val', ascending=False)
.groupby(['file', 'page_num'])
.head(2)
.reset_index()
)
rest = df[df['cls'] != 'c2']
final_df = pd.concat([top_2, rest])
(编辑:我添加了按 val
排序,因为从问题来看,尚不清楚数据帧是否已排序。)
关于python - pandas 按多列分组并选择前 n 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55887463/