
本文介绍如何使用Pandas高效地标准化数据集中的标签列。针对每个唯一ID,我们将根据其出现频率选择最常见的标签作为标准标签;若存在并列最常见的标签,则默认选择首次出现的标签。文章将通过实际代码示例,详细阐述实现这一逻辑的多种方法,并强调`Series.mode()`方法的简洁与高效性。
在数据处理和分析中,我们经常会遇到同一实体拥有多种不同表达形式的标签,例如“LA Metro”和“Los Angeles Metro”可能指代同一个交通机构。为了确保数据的一致性、提高分析的准确性,并简化后续的数据操作,对这些标签进行标准化是至关重要的一步。
本文的目标是实现一个通用的标签标准化逻辑:对于数据集中每个唯一的标识符(ID),我们希望找到与其关联的所有标签中出现频率最高的那个作为其标准标签。如果存在多个标签出现频率相同且均为最高(即并列最常见),则选择在该ID分组内首次出现的那个标签作为默认标准。
Pandas的Series.mode()方法是解决此类问题的关键。它返回一个包含Series中最常出现的值的Series。如果存在多个值具有相同的最高出现频率,mode()会返回所有这些值。当我们只需要其中一个作为标准时,可以通过索引[0]来选择第一个值,这恰好满足了“若并列则取首次出现”的需求。
例如:
groupby().transform()是Pandas中一个非常强大且高效的操作,它允许我们将分组操作的结果广播回原始DataFrame的形状,从而可以直接创建新列。这种方法通常比apply()更高效,尤其是在大数据集上。
实现步骤:
示例代码:
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作为标准。这完美符合了我们的需求。
另一种实现方式是先计算出每个ID的标准标签,然后将这些标准标签映射回原始DataFrame。这种方法在逻辑上更接近于先前的尝试,但通过mode()简化了获取标准标签的逻辑。
实现步骤:
示例代码:
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可以看到,两种方法得到了完全一致的标准化结果。
本文详细介绍了如何使用Pandas高效地对数据标签进行标准化。通过利用Series.mode()方法的特性,我们能够简洁地实现“按ID分组,取最常见标签,若并列则取第一个”的复杂逻辑。其中,df.groupby('ID')['raw_label'].transform(lambda x: x.mode()[0])是实现此功能的最推荐方式,它兼具简洁性、可读性和出色的性能。掌握这一技巧将有助于你在数据清洗和预处理阶段,更有效地统一和管理数据标签。
以上就是使用Pandas标准化数据标签:按ID获取最常见或首个标签的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号