0

0

使用Pandas标准化数据标签:按ID获取最常见或首个标签

心靈之曲

心靈之曲

发布时间:2025-10-18 10:13:00

|

611人浏览过

|

来源于php中文网

原创

使用pandas标准化数据标签:按id获取最常见或首个标签

本文介绍如何使用Pandas高效地标准化数据集中的标签列。针对每个唯一ID,我们将根据其出现频率选择最常见的标签作为标准标签;若存在并列最常见的标签,则默认选择首次出现的标签。文章将通过实际代码示例,详细阐述实现这一逻辑的多种方法,并强调`Series.mode()`方法的简洁与高效性。

引言:数据标签标准化的必要性

在数据处理和分析中,我们经常会遇到同一实体拥有多种不同表达形式的标签,例如“LA Metro”和“Los Angeles Metro”可能指代同一个交通机构。为了确保数据的一致性、提高分析的准确性,并简化后续的数据操作,对这些标签进行标准化是至关重要的一步。

本文的目标是实现一个通用的标签标准化逻辑:对于数据集中每个唯一的标识符(ID),我们希望找到与其关联的所有标签中出现频率最高的那个作为其标准标签。如果存在多个标签出现频率相同且均为最高(即并列最常见),则选择在该ID分组内首次出现的那个标签作为默认标准。

核心工具:Series.mode()的巧妙应用

Pandas的Series.mode()方法是解决此类问题的关键。它返回一个包含Series中最常出现的值的Series。如果存在多个值具有相同的最高出现频率,mode()会返回所有这些值。当我们只需要其中一个作为标准时,可以通过索引[0]来选择第一个值,这恰好满足了“若并列则取首次出现”的需求。

例如:

  • ['A', 'A', 'B', 'C'].mode() 返回 ['A']
  • ['A', 'A', 'B', 'B', 'C'].mode() 返回 ['A', 'B']
  • ['A', 'A', 'B', 'B', 'C'].mode()[0] 返回 ['A']

方法一:使用 groupby().transform() 实现高效标准化

groupby().transform()是Pandas中一个非常强大且高效的操作,它允许我们将分组操作的结果广播回原始DataFrame的形状,从而可以直接创建新列。这种方法通常比apply()更高效,尤其是在大数据集上。

实现步骤:

  1. 按ID列进行分组。
  2. 对每个分组的标签列应用一个lambda函数,该函数调用mode()[0]来获取最常见的标签(或并列情况下的第一个)。
  3. transform()会自动将这个结果扩展到原始分组的每一行。

示例代码:

import pandas as pd

# 示例数据
data = {
    'ID': [222, 222, 222, 222, 222, # LA Metro (3), Los Angeles Metro (2) -> LA Metro
           111, 111, 111,          # Apple (2), Apple Inc. (1) -> Apple
           333, 333, 333,          # Banana (2), Orange (1) -> Banana
           444, 444,               # Car (1), Truck (1) -> Car (first encountered)
           555, 555, 555, 555],    # A (2), B (2) -> A (first encountered)
    'raw_label': ['LA Metro', 'LA Metro', 'Los Angeles Metro', 'LA Metro', 'Los Angeles Metro',
                  'Apple', 'Apple Inc.', 'Apple',
                  'Banana', 'Banana', 'Orange',
                  'Car', 'Truck',
                  'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)

# 使用 transform 和 mode() 进行标准化
df['standardized_label'] = df.groupby('ID')['raw_label'].transform(lambda x: x.mode()[0])

print("\n方法一:使用 transform() 标准化后的数据:")
print(df)

输出结果:

零一万物开放平台
零一万物开放平台

零一万物大模型开放平台

下载
原始数据:
     ID          raw_label
0   222           LA Metro
1   222           LA Metro
2   222  Los Angeles Metro
3   222           LA Metro
4   222  Los Angeles Metro
5   111              Apple
6   111         Apple Inc.
7   111              Apple
8   333             Banana
9   333             Banana
10  333             Orange
11  444                Car
12  444              Truck
13  555                  A
14  555                  B
15  555                  A
16  555                  B

方法一:使用 transform() 标准化后的数据:
     ID          raw_label standardized_label
0   222           LA Metro           LA Metro
1   222           LA Metro           LA Metro
2   222  Los Angeles Metro           LA Metro
3   222           LA Metro           LA Metro
4   222  Los Angeles Metro           LA Metro
5   111              Apple              Apple
6   111         Apple Inc.              Apple
7   111              Apple              Apple
8   333             Banana             Banana
9   333             Banana             Banana
10  333             Orange             Banana
11  444                Car                Car
12  444              Truck                Car
13  555                  A                  A
14  555                  B                  A
15  555                  A                  A
16  555                  B                  A

从结果可以看出,对于ID 222,LA Metro是出现频率最高的标签(3次),因此被选为标准。对于ID 444,Car和Truck都只出现1次,mode()[0]选择了在原始数据中Car先出现,因此Car成为标准。对于ID 555,A和B都出现2次,mode()[0]选择了A作为标准。这完美符合了我们的需求。

方法二:结合 groupby().apply() 和 map()

另一种实现方式是先计算出每个ID的标准标签,然后将这些标准标签映射回原始DataFrame。这种方法在逻辑上更接近于先前的尝试,但通过mode()简化了获取标准标签的逻辑。

实现步骤:

  1. 定义一个辅助函数,该函数接收一个Series(即一个ID分组的标签列),并返回其mode()[0]。
  2. 按ID列进行分组,并对每个分组应用这个辅助函数,得到一个Series,其索引是ID,值是对应的标准标签。
  3. 使用DataFrame的map()方法,将这个标准标签Series映射回原始DataFrame的ID列,从而创建新的标准化标签列。

示例代码:

def standardize_labels_apply_map(df_input, id_col, label_col):
    """
    通过 groupby().apply() 和 map() 标准化标签。
    """
    # 定义一个函数来获取最常见的标签(或第一个,如果存在并列)
    def get_common_label(group_series):
        return group_series.mode()[0]

    # 按ID分组,应用函数获取每个ID的标准标签
    common_labels_series = df_input.groupby(id_col)[label_col].apply(get_common_label)

    # 将标准标签映射回原始DataFrame
    df_input['standardized_label_apply_map'] = df_input[id_col].map(common_labels_series)
    return df_input

df_apply_map = df.copy() # 使用副本避免修改原始df
df_apply_map = standardize_labels_apply_map(df_apply_map, 'ID', 'raw_label')

print("\n方法二:使用 apply() 和 map() 标准化后的数据:")
print(df_apply_map)

输出结果:

方法二:使用 apply() 和 map() 标准化后的数据:
     ID          raw_label standardized_label  standardized_label_apply_map
0   222           LA Metro           LA Metro                      LA Metro
1   222           LA Metro           LA Metro                      LA Metro
2   222  Los Angeles Metro           LA Metro                      LA Metro
3   222           LA Metro           LA Metro                      LA Metro
4   222  Los Angeles Metro           LA Metro                      LA Metro
5   111              Apple              Apple                         Apple
6   111         Apple Inc.              Apple                         Apple
7   111              Apple              Apple                         Apple
8   333             Banana             Banana                        Banana
9   333             Banana             Banana                        Banana
10  333             Orange             Banana                        Banana
11  444                Car                Car                           Car
12  444              Truck                Car                           Car
13  555                  A                  A                             A
14  555                  B                  A                             A
15  555                  A                  A                             A
16  555                  B                  A                             A

可以看到,两种方法得到了完全一致的标准化结果。

注意事项与性能考量

  1. 效率对比:在大多数情况下,groupby().transform()通常比groupby().apply()更高效,因为它在底层针对广播操作进行了优化。对于大规模数据集,推荐优先使用transform。
  2. mode()的鲁棒性:Series.mode()方法能够简洁而准确地处理标签出现频率最高的情况,包括存在并列最高频率值时默认取第一个的逻辑,这比手动通过value_counts()和条件判断来处理更为健壮和简洁。
  3. 数据类型:确保用于标签标准化的列是可哈希的(如字符串、数字等),以便mode()能够正确计算频率。
  4. 空值处理:mode()方法会默认忽略NaN值。如果你的标签列可能包含空值,且你希望空值参与标准化逻辑(例如,将空值视为一个标签),你需要提前进行填充或特殊处理。

总结

本文详细介绍了如何使用Pandas高效地对数据标签进行标准化。通过利用Series.mode()方法的特性,我们能够简洁地实现“按ID分组,取最常见标签,若并列则取第一个”的复杂逻辑。其中,df.groupby('ID')['raw_label'].transform(lambda x: x.mode()[0])是实现此功能的最推荐方式,它兼具简洁性、可读性和出色的性能。掌握这一技巧将有助于你在数据清洗和预处理阶段,更有效地统一和管理数据标签。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

54

2025.12.04

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

307

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

182

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

283

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

256

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

122

2025.08.07

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

278

2023.08.03

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

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

精品课程

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

共18课时 | 4.8万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.7万人学习

Django 教程
Django 教程

共28课时 | 3.4万人学习

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

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