Pandas 多列分组比对行数据并标记不一致性

本文介绍如何使用 pandas 对 dataframe 中具有相同关键列(如 country 和 reference year)的行进行分组比对,自动识别并标记 value 值不一致的记录为“invalid”,一致则为“valid”。核心方法是 groupby + transform('nunique')。

在实际数据清洗与质量校验中,常需检测同一业务主键(如国家+年份)下指标值是否唯一。若存在多个不同 value,则说明数据存在逻辑冲突或录入错误,需标记为异常。

以下是一个典型示例:我们有包含 Country、Reference Year 和 value 三列的数据,目标是——对 Country 与 Reference Year 完全相同的行进行分组,若该组内 value 存在多个不同非空/有效值(或含空值与非空混存),则整组标记为 "Invalid";否则为 "Valid"

import pandas as pd
import numpy as np

df1 = pd.DataFrame(
    data=[['Afghanistan','2015','5.1'],
          ['Afghanistan','2015','6.1'],
          ['Bahrain','2020',''],
          ['Bahrain','2020','32'],
          ['Bahrain','2021','32'],
          ['Bahrain','2022','32']],
    columns=['Country', 'Reference Year', 'value']
)

关键思路是:
✅ 按 ['Country', 'Reference Year'] 分组;
✅ 对每组的 'value' 列统计其去重后数量(nunique)
✅ 若某组 nunique > 1,说明该组 value 不一致 → 全部标记为 "Invalid";
✅ 否则标记为 "Valid"。

实现代码简洁高效:

df1['Validity'] = np.where(
    df1.groupby(['Country', 'Reference Year'])['value'].transform('nunique').gt(1),
    'Invalid',
    'Valid'
)

✅ transform('nunique') 会将每组的去重计数广播回原 DataFrame 的对应行,保持索引对齐;
✅ .gt(1) 等价于 > 1,返回布尔 Series;
✅ np.where 根据条件批量赋值,避免循环或 apply,性能优异。

运行后结果如下:

Designs.ai

AI设计工具

下载

Country Reference Year value Validity

Afghanistan
2015
5.1
Invalid

Afghanistan
2015
6.1
Invalid

Bahrain
2020

Invalid

Bahrain
2020
32
Invalid

Bahrain
2021
32
Valid

Bahrain
2022
32
Valid

⚠️ 注意事项:

  • nunique() 默认忽略 NaN,但本例中空字符串 '' 被视为有效值(非 NaN),因此 ['', '32'] 被计为 2 个不同值;如需将空字符串视作缺失,建议预处理:df1['value'] = df1['value'].replace('', np.nan);
  • 若 value 列含混合类型(如数字与字符串),nunique 仍能正确识别差异,但建议统一数据类型以提升鲁棒性;
  • 此方法天然支持任意数量的关键列(只需扩展 groupby([...]) 列表),扩展性强。

该方案兼具可读性、性能与工程实用性,是 Pandas 数据一致性校验的标准实践之一。

相关推荐:

谷歌为“我的广告中心”新增 AI 生成标记,可识别 AI 制作广告

7 月 10 日消息,谷歌昨天宣布为“My Ad Center”(注:我的广告中心)增加 AI 生成标记,用户可在此查看 Google 搜索、Google Discover 和 YouTube 展示的广告是否由 AI 生成或编辑。据介绍,用户只需要点击广告右边的三点菜单或信息按钮,就能查看广告是否由 AI 制作,还可以在此屏蔽或举报广告。谷歌表示,以后使用自家 AI 工具生成的广告,都会在投放时主...

三国杀神陆逊军略叠标记攻略

三国杀神陆逊军略怎么叠标记,神陆逊继承了火烧的这个特性,利用“军略”攒标记,“绽火”一波烧。不过好多新手神陆逊标记单数和双数把握不好,要么“绽火”没有发挥最大效益。下面就为大家带来神陆逊军略叠标记攻略。 三国杀神陆逊军略叠标记攻略: 一、技能机制深度解析 “军略”锁定技,当受到或造成1点伤害后,获得一个“军略”标记,这个技能属于被动技能,不需要玩家自己点击操作,标记的作用是为了后面的技能服务。 “...

WPS文字怎么删除回车符 批量清除文档段落标记方法

批量清除WPS中多余回车符需先显示段落标记确认类型:^p为段落标记(Enter产生),用Ctrl+H替换^p为空可全删;若需保留段落结构,则用通配符查找^13{2,}替换为^13压缩空行;另可用^l清除Shift+Enter产生的手动换行符。 当你从网页或微信公众号复制大段文字到WPS文字中,发现每行末尾都多出一个回车符,导致文档变成几十上百个零碎段落,手动删根本来不及,必须用批量清除手段一次性处...

Safari浏览器怎么标记网页_Safari浏览器网页标记方法【指南】

在 Safari 中快速保存网页需使用“标记”功能,包括 macOS 的“添加书签”(含快捷键 Command+D)、iOS 的“添加书签”、iPad 的“添加到个人收藏”及跨设备的“阅读列表”。 如果您在 Safari 浏览器中浏览网页时希望快速保存当前页面以便后续再次访问,则需要使用“标记”功能——该功能在不同设备上分别体现为“添加书签”或“添加到个人收藏”。以下是适用于 macOS、iOS ...

百词斩app怎么标记易混淆词_百词斩app标记易混淆词方法【步骤】

百词斩APP提供五种系统化标记易混淆词方法:一、长按单词添加混淆标签;二、生词本批量创建“混淆词对”词本;三、启用错题本自动归集机制;四、笔记模块手动绑定混淆逻辑链;五、词义对比面板生成混淆快照。 如果您在使用百词斩APP学习过程中,频繁将形近、义近或发音相近的单词(如“affect”与“effect”、“complement”与“compliment”)混淆,说明当前学习行为尚未建立有效辨析标记...

Excel标准差该用哪个 用Excel求分组数据的标准差

品牌型号:联想小新13 pro 系统:Windows 11 软件版本:Microsoft 365 Excel 内置丰富的函数体系,能够高效完成各类数据运算与分析任务。在实际应用中,标准差作为衡量数据离散程度的重要统计指标,常被用于评估数据波动性与稳定性。那么,在 Excel 中计算标准差时,究竟该选用哪一个函数?面对分组数据又该如何准确求得其标准差?本文将围绕这两个关键问题展开详细说明。 一、Ex...

iPhone怎么在照片上签名 苹果手机自带标记功能使用方法【技巧】

iPhone自带“标记”功能可为照片添加手写签名,支持在“照片”“信息”“邮件”App中操作,并能保存签名模板复用。 如果您想在iPhone拍摄或保存的照片上添加手写签名,系统自带的“标记”功能即可完成,无需第三方应用。以下是多种可行的操作路径和具体步骤: 一、通过“照片”App直接编辑签名 此方法适用于已保存在相册中的照片,利用原生编辑流程调出标记工具并插入签名。 1、打开“照片”App,找到并...

火狐浏览器多账号容器的颜色与专属图标怎么改_火狐浏览器标签分组视觉优化

可通过为容器设置专属颜色与图标、启用标签页顶部色带、绑定域名自动着色及用Firefox Color统一主题来强化视觉区分:一、在“管理容器”中编辑颜色和图标;二、about:config启用privacy.userContext.ui.colorfulTabs;三、将域名绑定至容器;四、用Firefox Color协调全局配色。 如果您在火狐浏览器中启用了多账户容器功能,但发现不同容器的标签页在视...