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

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)

逻辑说明

两种方法的核心逻辑一致:

  1. 按Name分组后统计每个分组内Age、Gender的唯一值数量
  2. 仅当两个字段的唯一值数量都为1时,说明该Name下所有行的Age和Gender完全一致,保留该分组所有行
  3. 最后重置索引得到和预期格式一致的结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:45:04