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

基于reference列nunique过滤DataFrame,求特殊规则下的高效实现

高效实现Pandas DataFrame的特殊规则过滤

问题背景

现有如下Pandas DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame(list(zip(['name1', 'name2', 'name2', 'name3', 'name2', 'name4', 'name4'],
                        ['a', 'b', 'c', 'b', 'c', 'b', 'b'],
                       ['USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA'],
                       [np.nan, np.nan, 'Jan', np.nan, np.nan, 'Jan', 'Jan'],
                       [1,2,3,4,5,6,7])),
                columns=['sample ID', 'reference', 'country', 'month', 'value'])

原本使用以下代码过滤:

df = df[df.groupby(['sample ID'])['reference'].transform('nunique') > 1]

现在需要新增规则:若某个sample ID对应的reference唯一值列表包含'a',即便仅存在'a'这一个值,也判定其nunique>1,要求更高效的实现方式,避免拆分拼接的繁琐操作。

高效解决方案

可以通过一次分组计算同时满足两个条件:原有的nunique>1,或者分组内存在'a'。使用transform生成布尔掩码即可:

# 计算每个sample ID的过滤条件:nunique>1 或 包含'a'
mask = df.groupby('sample ID')['reference'].transform(
    lambda x: x.nunique() > 1 or (x == 'a').any()
)

# 应用掩码得到过滤后的DataFrame
filtered_df = df[mask]

逻辑解释

  • x.nunique() >1:保留原规则中reference有多个唯一值的分组
  • (x == 'a').any():新增规则,只要分组内存在'a'就保留该分组的所有行
  • 通过transform将分组级的判断结果广播到每一行,生成布尔掩码后直接过滤

这种方法仅需一次分组操作,避免了拆分拼接的额外开销,在大数据集上的执行效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:55:09