
本文介绍如何在 Pandas 中基于多条件(如 colC > 0 且 colB 属于指定集合)筛选数据,按 colA 分组统计 colB 的唯一值个数,并仅保留计数大于 2 的分组,最终导出对应原始记录。
本文介绍如何在 pandas 中基于多条件(如 `colc > 0` 且 `colb` 属于指定集合)筛选数据,按 `cola` 分组统计 `colb` 的唯一值个数,并仅保留计数大于 2 的分组,最终导出对应原始记录。
在数据分析中,常需结合布尔过滤、分组聚合与后置筛选完成复杂逻辑——例如:仅保留那些在特定条件下(如 colC > 0 且 colB 属于预定义 ID 集合)拥有至少 N 个不同 colB 值的 colA 分组。本教程以实际需求为例,完整演示从条件过滤、分组计数、阈值筛选到结果回溯导出的全流程。
✅ 步骤一:按条件过滤并分组统计唯一值数量
首先定义关键 ID 集合与核心筛选条件:
key_id = {1008, 1051, 1003, 1005, 1072, 1079, 1092, 1093, 1004, 2000}
# 筛选:colC > 0 且 colB 在 key_id 中,提取 colB 列用于分组统计
filtered_series = filtData.loc[
(filtData['colC'] > 0) & (filtData['colB'].isin(key_id)),
'colB'
]
接着按 colA 分组,使用 .agg(UniqueNum='nunique') 统计每组中满足条件的 colB 唯一值个数:
grouped_counts = (
filtered_series
.groupby(filtData['colA']) # 注意:此处 groupby 使用原始 df 的 colA,确保索引对齐
.agg(UniqueNum='nunique')
.reset_index()
)
此时 grouped_counts 包含所有 colA 及其对应满足条件的 colB 唯一数量,但尚未过滤。
✅ 步骤二:筛选唯一数量 > 2 的分组(两种推荐写法)
方法 1:使用 .query()(推荐,语义清晰)
result_df = grouped_counts.query('UniqueNum > 2')
方法 2:使用 .loc + lambda(适合链式操作中嵌入布尔索引)
result_df = grouped_counts.loc[lambda x: x['UniqueNum'] > 2]
两者输出一致:
colA UniqueNum 0 1105904 3 1 1105905 4
⚠️ 注意:.query() 中字段名需为字符串,且不支持变量直接插值(如 @threshold 可用,但此处硬编码更简洁);而 .loc[lambda ...] 更灵活,便于程序化阈值控制。
✅ 步骤三:获取满足条件的 colA 集合,并回溯原始数据导出 CSV
得到 result_df 后,可快速构建目标 colA 的集合:
valid_colA_set = set(result_df['colA'])
再以此为依据,从原始数据中精确提取全部原始字段(colA, colB, colC),同时复用原有双重条件:
final_mask = (
(filtData['colA'].isin(valid_colA_set)) &
(filtData['colC'] > 0) &
(filtData['colB'].isin(key_id))
)
export_df = filtData.loc[final_mask, ['colA', 'colB', 'colC']].copy()
export_df.to_csv('filtered_output.csv', index=False)
该 export_df 即为最终符合业务逻辑的子集:
- 每条记录的 colA 必属于“在满足 colC>0 且 colB∈key_id 条件下拥有 ≥3 个不同 colB 值”的分组;
- 所有记录本身均满足 colC > 0 和 colB ∈ key_id。
? 总结与最佳实践
- 链式操作优先:将 .query() 或 .loc[lambda] 紧跟在 .agg().reset_index() 后,保持逻辑连贯、代码简洁;
- 避免重复计算:不要在 .loc 中重复写 colC > 0 和 colB.isin(...) 多次,应先过滤再聚合;
- 分组对齐关键:groupby(filtData['colA']) 中必须引用原始 DataFrame 的列(而非已过滤 Series),否则索引错位会导致分组错误;
- 扩展性提示:若需动态阈值(如参数 min_unique=2),建议封装为函数,并用 @ 符号在 .query() 中引用变量(如 .query('UniqueNum > @min_unique'))。
掌握这一模式,即可高效应对“条件过滤 → 分组聚合 → 阈值筛选 → 结果回溯”的典型 Pandas 数据处理闭环。










