
在数据处理中,我们经常会遇到需要对非结构化或半结构化的字符串数据进行聚合和规范化的情况。例如,一个列可能包含由“&”符号连接的多个成员名称,我们需要按类别(CLASS)分组,收集所有成员,去除重复,并按照一个预设的特定顺序重新排列这些成员。
考虑以下Pandas DataFrame:
import pandas as pd
df = pd.DataFrame({'CLASS': ['A', 'B', 'A'],
'MEMBERS': ['foo & bar', 'bar & luz', 'baz']})
print(df)
# CLASS MEMBERS
# 0 A foo & bar
# 1 B bar & luz
# 2 A baz我们的目标是:
期望的输出是:
# CLASS # A foo & bar & baz # B bar & luz # Name: MEMBERS, dtype: object
实现这一目标的通用方法是结合Pandas的 groupby().agg() 功能,并在聚合函数中使用Python内置的 sorted() 函数,辅以一个自定义的排序键。
order = ['foo', 'bar', 'baz', 'luz']
mapper = {k: i for i, k in enumerate(order)}
# mapper 会是 {'foo': 0, 'bar': 1, 'baz': 2, 'luz': 3}order = ['foo', 'bar', 'baz', 'luz']
# 创建一个映射字典,用于自定义排序
mapper = {k: i for i, k in enumerate(order)}
# 使用groupby和agg进行聚合和排序
out = (df.groupby('CLASS')['MEMBERS']
.agg(lambda s: " & ".join(sorted(set(' & '.join(s).split(' & ')),
key=mapper.get)))
)
print(out)输出结果:
CLASS A foo & bar & baz B bar & luz Name: MEMBERS, dtype: object
上述 lambda 表达式虽然简洁,但在处理复杂的字符串拆分和扁平化逻辑时,可能会显得不够清晰。Python的 itertools.chain 模块提供了一种更高效、更Pythonic 的方式来扁平化嵌套的迭代器。我们可以将整个逻辑封装在一个独立的函数中,提高代码的可读性和复用性。
from itertools import chain
def cust_join(s, order):
"""
聚合Series中的字符串,提取唯一成员,并按指定顺序排序后重新连接。
s: Pandas Series,包含要处理的字符串。
order: 列表,指定成员的期望排序顺序。
"""
# 创建映射字典用于自定义排序
mapper = {k: i for i, k in enumerate(order)}
# 使用itertools.chain扁平化所有成员,然后去重
unique_members = set(chain.from_iterable(x.split(' & ') for x in s))
# 根据mapper进行排序
sorted_members = sorted(unique_members, key=mapper.get)
# 重新连接成字符串
return ' & '.join(sorted_members)
# 定义排序顺序
desired_order = ['foo', 'bar', 'baz', 'luz']
# 使用groupby和agg,并传入自定义函数和额外参数
out_alt = (df.groupby('CLASS')['MEMBERS']
.agg(cust_join, order=desired_order)
)
print(out_alt)输出结果:
CLASS A foo & bar & baz B bar & luz B bar & luz Name: MEMBERS, dtype: object
通过本文介绍的两种方法,您可以在Pandas中灵活地对字符串元素进行分组、去重和自定义排序,以满足各种复杂的数据清洗和聚合需求。
以上就是在Pandas中聚合并按指定顺序重排字符串元素的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号