在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
相关产品推荐
相关产品推荐

