Pandas识别A/B/C列同值且组内D列含Invalid的行并返回布尔向量
Pandas 实现方案
核心逻辑是按A、B、C三列分组后,判断每个分组的D列是否存在'Invalid'值,再将分组级别的判定结果映射到组内所有行。
步骤1:构造示例数据
import pandas as pd import numpy as np df = pd.DataFrame({ 'A': [0,0,0,1,1,1,2,2,2,1], 'B': [0,0,0,1,1,1,2,2,2,2], 'C': [0,0,0,1,1,1,2,2,2,5], 'D': [np.nan, np.nan, 'Invalid', np.nan, np.nan, np.nan, np.nan, np.nan, 'update', np.nan] })
步骤2:核心实现(一行代码搞定)
用groupby.transform直接将分组判定结果广播到每一行,是最简洁的写法:
result = df.groupby(['A', 'B', 'C'])['D'].transform(lambda x: (x == 'Invalid').any())
输出结果验证
针对示例数据,输出的布尔向量如下,完全符合预期:
0 True 1 True 2 True 3 False 4 False 5 False 6 False 7 False 8 False 9 False Name: D, dtype: bool
大数据量优化方案
如果你的数据量超过10万行,用merge的方式性能更好,避免lambda函数在transform中的额外开销:
# 先计算每个分组是否存在Invalid group_flag = df.groupby(['A', 'B', 'C'])['D'].agg(has_invalid=lambda x: (x == 'Invalid').any()).reset_index() # 关联回原表得到每行的结果 df = df.merge(group_flag, on=['A', 'B', 'C'], how='left') result = df['has_invalid']
内容的提问来源于stack exchange,提问作者Francesco Gualtieri
相关产品推荐
相关产品推荐

