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

在Pandas中按客户组筛选行:有score≥0.5则取该行,否则取全组

如何在Pandas中实现分组条件筛选——组内满足特定条件时筛选子集,否则保留全组

首先构造目标DataFrame:

import pandas as pd

df = pd.DataFrame({
    'customer': ['cust1', 'cust1', 'cust1', 'cust2', 'cust2', 'cust3', 'cust3', 'cust4', 'cust4'],
    'year': [2017, 2018, 2019, 2018, 2019, 2017, 2018, 2018, 2019],
    'score': [0.10, 0.59, 0.3, 0.44, 0.2, 0.78, 0.6, 0.37, .023]
})

需求规则

若组内存在score≥0.5的行,则仅保留该组中score>0.5的行;
若组内无score>0.5的行,则保留该组所有行。

解决方案

利用groupby.transform将组级判断结果广播到每一行,生成筛选掩码即可实现需求:

# 标记每个客户组是否存在score≥0.5的行
has_high_score = df.groupby('customer')['score'].transform(lambda x: (x >= 0.5).any())

# 生成筛选条件:组内无高分则全留,组内有高分则仅留score>0.5的行
filter_condition = (~has_high_score) | (df['score'] > 0.5)

# 应用筛选并重置索引
result = df[filter_condition].reset_index(drop=True)

验证结果

输出result可得到预期结果:

customer  year  score
0    cust1  2018   0.59
1    cust2  2018   0.44
2    cust2  2019   0.20
3    cust3  2017   0.78
4    cust3  2018   0.60
5    cust4  2018   0.37
6    cust4  2019   0.02

原理说明

  • groupby.transform对每个分组执行判断后,会将结果扩展为与原DataFrame同长度的Series,让每一行都能获取所在组的"是否存在高分"标记。
  • 逻辑或的筛选条件直接匹配规则:组内无高分时保留所有行,组内有高分时仅保留符合score>0.5的行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:31:20