0

0

Pandas数据清洗:基于多数原则和首次出现规则标准化ID标签

DDD

DDD

发布时间:2025-10-18 11:01:41

|

965人浏览过

|

来源于php中文网

原创

pandas数据清洗:基于多数原则和首次出现规则标准化id标签

本文详细阐述了在Pandas DataFrame中如何为每个唯一ID标准化其关联的标签。核心策略是优先选择ID下出现频率最高的标签,当存在多个标签出现次数相同时,则默认选取首次出现的标签作为标准。通过结合groupby()和mode()方法,我们能够高效且准确地实现这一复杂的标签标准化逻辑,有效解决数据不一致性问题。

1. 引言:标签标准化的问题与挑战

在实际数据处理中,我们经常会遇到同一实体(例如,由唯一ID标识)拥有多个不同但含义相近的标签的情况。例如,一个公司可能在不同记录中被标记为“Apple Inc.”、“Apple”或“苹果公司”。为了数据分析的一致性和准确性,我们需要将这些不一致的标签标准化为一个统一的表示。

本文将探讨一种常见的标准化策略:

  1. 多数原则:对于每个ID,选取其关联标签中出现次数最多的标签作为标准。
  2. 平局处理:如果存在多个标签出现次数相同且都为最高频率,则默认选取这些最高频率标签中首次出现的那个。

这种策略旨在平衡数据中的主流趋势和在不确定性时的确定性选择。

2. Pandas groupby()与mode()方法解析

Pandas库提供了强大的数据分组和聚合功能,非常适合处理这类问题。其中,groupby()用于按指定列对DataFrame进行分组,而Series.mode()方法则能找到Series中最常出现的值。

Series.mode()的特性是:

  • 如果只有一个最常出现的值,它将返回一个包含该值的Series。
  • 如果有多个值出现频率相同且都是最高频率,它将返回一个包含所有这些值的Series。

为了满足“平局时选取首次出现的标签”的要求,我们可以在mode()的结果后加上[0],这会从可能包含多个最高频率值的Series中选取第一个值。

Akkio
Akkio

Akkio 是一个无代码 AI 的全包平台,任何人都可以在几分钟内构建和部署AI

下载

3. 实现标签标准化的方法

我们将通过两种主要方式来实现标签标准化:使用groupby().transform()和使用groupby().apply()。

3.1 使用 groupby().transform() 实现简洁标准化

transform()方法是groupby()的一个强大功能,它允许在每个组上应用一个函数,并将结果广播回原始DataFrame的形状,非常适合创建新列。

import pandas as pd

def standardize_labels_transform(df: pd.DataFrame, id_col: str, label_col: str) -> pd.DataFrame:
    """
    根据多数原则和首次出现规则,使用groupby().transform()标准化DataFrame中的标签。

    参数:
    df (pd.DataFrame): 输入DataFrame。
    id_col (str): 标识唯一实体的列名。
    label_col (str): 需要标准化的标签列名。

    返回:
    pd.DataFrame: 包含'standardized_label'新列的DataFrame。
    """
    # 按ID分组,对标签列应用mode()[0]并使用transform广播结果
    df['standardized_label'] = df.groupby(id_col)[label_col].transform(lambda x: x.mode()[0])
    return df

# 示例数据
data = {
    'ID': [222, 222, 222, 222, 222, 111, 111, 111, 333, 333, 333, 333],
    'raw_label': ['LA Metro', 'LA Metro', 'Los Angeles Metro', 'LA Metro', 'Los Angeles Metro',
                  'Apple', 'Apple Inc.', 'Apple', 'Google', 'Alphabet', 'Google', 'Alphabet']
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)

df_standardized = standardize_labels_transform(df.copy(), 'ID', 'raw_label')
print("\n使用transform标准化后的数据:")
print(df_standardized)

代码解析:

  • df.groupby(id_col)[label_col]:按id_col列对DataFrame进行分组,并选择label_col进行后续操作。
  • .transform(lambda x: x.mode()[0]):对每个组的label_col Series应用一个匿名函数。
    • x.mode():找出当前组中最常出现的标签(可能返回多个,如果存在平局)。
    • [0]:从mode()返回的Series中选取第一个元素,这确保了在多个标签出现频率相同且都为最高频率时的确定性选择。
  • transform方法会将每个组计算出的标准化标签广播回原组的所有行,从而在原始DataFrame中创建或更新standardized_label列。

3.2 使用 groupby().apply() 实现模块化标准化

apply()方法提供了更大的灵活性,可以在每个分组上应用自定义函数,并返回一个Series或DataFrame。我们可以先计算出每个ID的标准标签,然后通过map()将其映射回原始DataFrame。

def standardize_labels_apply(df: pd.DataFrame, id_col: str, label_col: str) -> pd.DataFrame:
    """
    根据多数原则和首次出现规则,使用groupby().apply()标准化DataFrame中的标签。

    参数:
    df (pd.DataFrame): 输入DataFrame。
    id_col (str): 标识唯一实体的列名。
    label_col (str): 需要标准化的标签列名。

    返回:
    pd.DataFrame: 包含'standardized_label'新列的DataFrame。
    """
    # 1. 定义一个辅助函数,用于获取每个组的标准标签
    def get_standard_label(group_series):
        return group_series.mode()[0]

    # 2. 按ID分组,并应用辅助函数,得到每个ID的标准标签
    # 结果是一个Series,索引为ID,值为对应的标准标签
    common_labels = df.groupby(id_col)[label_col].apply(get_standard_label)

    # 3. 将标准标签映射回原始DataFrame的相应ID
    df['standardized_label'] = df[id_col].map(common_labels)
    return df

df_standardized_apply = standardize_labels_apply(df.copy(), 'ID', 'raw_label')
print("\n使用apply标准化后的数据:")
print(df_standardized_apply)

代码解析:

  • get_standard_label(group_series):这是一个内部函数,接收一个Series(即每个组的label_col数据),并返回其mode()[0]。
  • df.groupby(id_col)[label_col].apply(get_standard_label):对每个ID组的label_col应用get_standard_label函数。此操作会生成一个Series,其索引是ID,值是对应的标准标签。
  • df[id_col].map(common_labels):使用map()方法,将common_labels(即每个ID的标准标签字典)中的标准标签根据ID列的值映射到新创建的standardized_label列。

4. 注意事项与最佳实践

  • 性能考量:对于大型数据集,transform()通常比apply()(尤其是当apply()返回Series或DataFrame时)更高效,因为它在C语言级别进行了优化。然而,在某些复杂场景下,apply()提供了更大的灵活性。
  • 空值处理:mode()方法默认会忽略NaN值。如果需要将NaN作为一种标签进行处理,需要进行额外的预处理或参数设置。
  • 数据类型:确保label_col的数据类型适合进行mode()操作,通常是字符串或分类类型。
  • 可读性与维护性:transform()的单行代码可能更简洁,而apply()结合辅助函数的方式可能在逻辑更复杂时提供更好的可读性和模块化。
  • 平局规则:mode()[0]的平局规则是“取第一个”,这取决于mode()内部对等频值的排序。在Pandas中,这通常是按照它们在原始数据中出现的顺序或内部哈希顺序。如果需要更精细的平局规则(例如按字母顺序),则需要自定义函数来替代mode()。

5. 总结

本文详细介绍了如何在Pandas中实现基于多数原则和首次出现规则的标签标准化。无论是通过简洁高效的groupby().transform(),还是通过灵活模块化的groupby().apply(),结合Series.mode()[0]都能有效地解决同一实体多标签不一致的问题。选择哪种方法取决于具体的性能需求、代码可读性偏好以及逻辑的复杂程度。掌握这些技术将大大提升数据清洗和预处理的能力,为后续的数据分析奠定坚实基础。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

401

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

620

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

354

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

259

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

606

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

531

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

646

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

604

2023.09.22

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 4.3万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号