Pandas如何迭代行比较同姓名关联字段值并过滤不符合要求的行
Pandas DataFrame按Name分组过滤行实现
需求规则
- 对DataFrame按Name字段分组,若同一个Name对应的Age或Gender字段存在多个不同取值,删除该Name对应的全部行
- 仅保留同一Name下Age、Gender取值完全一致的所有行
示例数据准备
创建测试用DataFrame代码:
import pandas as pd df = pd.DataFrame({'Name' : ['Mark', 'Mark', 'Mark', 'Mark', 'Mark', 'Nick', 'Nick', 'John', 'Sunny', 'Sunny'], 'Age' : ['22', '22', '25', '25', '17', '20', '20', '17', '23', '23'], 'Gender' : ['F', 'F', 'F', 'F', 'F', 'F', 'F', 'M', 'M', 'M']})
原DataFrame内容:
Name Age Gender 0 Mark 22 F 1 Mark 22 F 2 Mark 25 F 3 Mark 25 F 4 Mark 17 F 5 Nick 20 F 6 Nick 20 F 7 John 17 M 8 Sunny 23 M 9 Sunny 23 M
预期输出:
Name Age Gender 0 Nick 20 F 1 Nick 20 F 2 John 17 M 3 Sunny 23 M 4 Sunny 23 M
实现代码
方法1:groupby + filter(写法更简洁)
直接按Name分组后过滤符合条件的分组:
result = df.groupby('Name').filter( lambda group: group['Age'].nunique() == 1 and group['Gender'].nunique() == 1 ).reset_index(drop=True)
方法2:groupby + transform(大表性能更优)
生成每行对应的判断条件后过滤:
# 分别判断同Name下Age、Gender是否唯一 cond_age_unique = df.groupby('Name')['Age'].transform('nunique') == 1 cond_gender_unique = df.groupby('Name')['Gender'].transform('nunique') == 1 result = df[cond_age_unique & cond_gender_unique].reset_index(drop=True)
逻辑说明
两种方法的核心逻辑一致:
- 按Name分组后统计每个分组内Age、Gender的唯一值数量
- 仅当两个字段的唯一值数量都为1时,说明该Name下所有行的Age和Gender完全一致,保留该分组所有行
- 最后重置索引得到和预期格式一致的结果
内容的提问来源于stack exchange,提问作者Nithin Reddy
相关产品推荐
相关产品推荐

