You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas基于动态数组列实现按个体的个性化数据过滤?

解决Pandas中按自定义分组配额筛选记录的问题

这个需求的核心是针对每个individual,根据给定的配额数组,从按概率排序的分组中抽取对应数量的高优先级记录,我们可以通过groupby结合自定义函数来完美实现,下面是详细的步骤和代码:

核心思路拆解

对于每个individual的分组,我们需要完成以下操作:

  1. 提取该个体对应的配额数组element_counts(每个个体的配额是统一的,取任意一行的数组即可)
  2. 将该个体的所有记录按cluster_choice_prob_k_fold降序排序,再按该字段分组,得到从高到低的概率分组序列
  3. 遍历前5个概率分组(对应配额数组的5个元素),从每个分组中选取benchmark_probabilities最高的N条记录(N为配额数组对应位置的数值)
  4. 合并所有选中的记录,作为该个体的最终结果

实现代码

假设你的数据存储在Pandas DataFrame df中,我们可以编写如下自定义函数并通过groupby.apply应用:

import pandas as pd

def filter_individual_records(group):
    # 获取当前个体的配额数组(所有行的element_counts一致,取第一行即可)
    quota = group['element_counts'].iloc[0]
    
    # 按cluster概率降序排序,再按该字段分组,保持分组顺序为概率从高到低
    sorted_cluster_groups = (
        group.sort_values('cluster_choice_prob_k_fold', ascending=False)
             .groupby('cluster_choice_prob_k_fold', sort=False)
    )
    
    selected_records = []
    # 遍历前5个cluster分组,按配额抽取记录
    for idx, (cluster_val, cluster_group) in enumerate(sorted_cluster_groups):
        if idx >= 5:
            break  # 仅处理Top5概率分组
        take_n = quota[idx]
        if take_n <= 0:
            continue  # 配额为0时跳过该分组
        
        # 从当前cluster分组中选取benchmark概率最高的take_n条记录
        top_records = cluster_group.sort_values('benchmark_probabilities', ascending=False).head(take_n)
        selected_records.append(top_records)
    
    # 合并所有选中的记录,若没有选中则返回空DataFrame(保持结构一致)
    return pd.concat(selected_records, ignore_index=True) if selected_records else pd.DataFrame(columns=group.columns)

# 应用函数到每个individual分组
final_result = df.groupby('individual', group_keys=False).apply(filter_individual_records)

关键细节说明

  • 保持分组顺序:groupby时设置sort=False,确保cluster分组的顺序是按cluster_choice_prob_k_fold降序排列的,和配额数组的位置一一对应
  • 配额适配:函数会自动适配不同个体的element_counts数组,不管数组内的数值如何(只要是5个元素且总和为5),都能正确抽取对应数量的记录
  • 边界处理:如果某个个体的cluster_choice_prob_k_fold不同值少于5个,函数会自动跳过超出的配额位置;如果某个分组的记录数少于配额数,head(take_n)会取该分组的全部记录,不会报错

示例验证

用你提供的示例数据测试,假设原始数据中individual=9710535有更多记录,应用函数后会精准抽取:

  • 从最大的cluster_choice_prob_k_fold分组(0.512776)取3条benchmark_probabilities最高的记录
  • 从次大的分组(0.294674)取2条最高记录
  • 后3个分组因配额为0被跳过
    最终得到你展示的结果。

内容的提问来源于stack exchange,提问作者Emil Mirzayev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 20:27:47