Pandas中不使用apply/lambda通过groupby比较两列的最简方法
Pandas 基于groupby实现分组两列逐行对比的最简方法(无apply/lambda)
你之前写的代码无法得到预期结果,核心原因是直接对GroupBy对象调用eq会按分组聚合后的维度做值对齐,不会返回和原表行号一一对应的逐行判断结果。
实现代码
首先构造示例测试DataFrame:
import pandas as pd df = pd.DataFrame({ "product1": ["apple", "apple"], "product2": ["apples", "apple"], "person": ["abby", "abby"] })
核心逻辑调用groupby配套的transform方法即可,该方法会将运算结果按原表索引自动对齐,直接得到逐行判断的布尔序列,全程不需要apply或lambda:
res = df.groupby("person")["product1"].transform("eq", df["product2"])
执行后res的输出完全匹配预期:
0 False 1 True dtype: bool
补充说明
- 该写法全部基于pandas内置向量化运算,执行效率远高于
apply类循环写法 transform会自动保留原DataFrame的行索引顺序,不需要额外做结果拼接、索引重置操作- 逻辑可直接扩展到其他对比场景,比如判断大小只需要把
eq替换为gt(大于)、lt(小于)即可 - 如果不需要按
person分组限定对比范围,直接逐行判断两列相等可以不用groupby,直接写df.product1.eq(df.product2)就能拿到结果。
内容的提问来源于stack exchange,提问作者asd
相关产品推荐
相关产品推荐

