如何在Pandas DataFrame中按不同条件筛选各组Top N主题?
高效实现不同child_group下各parent_group的TopN主题筛选
不需要拆分DataFrame,直接通过分组操作就能高效完成需求,以下是两种实用方案:
方案1:分组+自定义逻辑(直观易读)
通过groupby同时按child_groups和parent_groups分组,结合apply对每个组执行排序取TopN的操作:
# 定义每个child_group对应的TopN数量 top_n_map = {1: 2, 2: 3} # 分组筛选:每个(child_group, parent_group)组按scores降序取前N个主题 result = df.groupby(['child_groups', 'parent_groups'], group_keys=False).apply( lambda x: x.sort_values('scores', ascending=False).head(top_n_map[x.name[0]]) )
x.name[0]获取当前分组的child_group值,从映射字典中匹配对应的TopN数量group_keys=False避免结果中保留多余的分组索引
方案2:排名筛选(性能更优,适合大数据集)
利用rank进行向量化排名计算,比apply效率更高,适合处理大规模数据:
top_n_map = {1: 2, 2: 3} # 计算每个(child_group, parent_group)组内scores的降序排名(相同分数取最小排名) df['rank'] = df.groupby(['child_groups', 'parent_groups'])['scores'].rank(ascending=False, method='min') # 根据child_group匹配TopN阈值,筛选符合条件的行 result = df[df['rank'] <= df['child_groups'].map(top_n_map)].drop(columns='rank')
- 向量化操作避免了循环,处理大数据集时性能提升明显
method='min'确保相同分数的主题不会被错误过滤
内容的提问来源于stack exchange,提问作者DaCard
相关产品推荐
相关产品推荐

