
本教程详细介绍了如何在pandas dataframe中,根据一列中逗号分隔的id列表,从其他行查找并聚合相关数据(如url),最终将其合并成一个新的逗号分隔列。文章提供了两种高效的pandas解决方案,包括利用explode、map和groupby,以及结合列表推导式和series.get(),旨在避免低效的行级循环,提升数据处理性能。
在数据处理和分析中,我们经常遇到需要将分散在多行中的相关信息聚合到单个单元格的场景。一个常见的例子是,根据某个关联ID列表(通常以逗号或其他分隔符连接)从数据集中查找对应的详细信息,并将这些信息合并成一个新的逗号分隔字符串。例如,在一个包含URL的DataFrame中,我们可能需要根据另一列中包含的引用ID列表,查找这些ID对应的URL,并将它们合并到一个新的列中。
传统的做法可能会使用for循环遍历每一行,然后进行查找和合并。然而,在处理大型数据集时,这种行级迭代的方法效率极低,与Pandas的矢量化操作理念相悖。本文将介绍两种基于Pandas的高效方法,以解决此类数据聚合与合并问题。
为了演示这些方法,我们首先创建一个示例DataFrame,其结构与实际问题描述一致:
import pandas as pd
# 示例数据
data = {
'Ref': [1, 2, 3, 4, 4, 5, 7],
'Option1_Ref': ['2,3,4', '1,4,5', '1,6', '1,5', '2,5', '3,1', '2,5'],
'URL': ['/path1', '/path2', '/path3', '/path4', '/path5', '/path6', '/path7']
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)输出的原始DataFrame如下所示:
原始DataFrame: Ref Option1_Ref URL 0 1 2,3,4 /path1 1 2 1,4,5 /path2 2 3 1,6 /path3 3 4 1,5 /path4 4 4 2,5 /path5 5 5 3,1 /path6 6 7 2,5 /path7
我们的目标是根据Option1_Ref列中的每个ID,在Ref列中查找对应的URL,然后将查找到的所有URL合并成一个逗号分隔的字符串,存储在新的options_url1列中。需要注意的是,Ref列中可能存在重复值,但每个Ref值在作为查找键时应对应一个唯一的URL。
这种方法是Pandas中处理列表型数据并进行聚合的强大组合,它通过扁平化、映射和重新聚合的步骤,高效地完成任务。
# 1. 创建Ref到URL的查找Series
# drop_duplicates('Ref')确保每个Ref只有一个对应的URL
# astype({'Ref': str}) 确保Ref的数据类型与Option1_Ref拆分后的字符串ID一致
s = df.drop_duplicates('Ref').astype({'Ref': str}).set_index('Ref')['URL']
# 2. 应用explode, map, groupby进行聚合
df['options_url1'] = (
df["Option1_Ref"]
.str.split(',') # 拆分Option1_Ref为列表
.explode() # 展开列表,每个ID占一行
.map(s) # 将展开的ID映射到对应的URL
.dropna() # 移除无法映射的(即ID不在s中的)
.groupby(level=0) # 根据原始索引分组
.agg(','.join) # 合并URL为逗号分隔字符串
)
print("\n方法一结果DataFrame:")
print(df)输出结果:
方法一结果DataFrame: Ref Option1_Ref URL options_url1 0 1 2,3,4 /path1 /path2,/path3,/path4 1 2 1,4,5 /path2 /path1,/path4 2 3 1,6 /path3 /path1 3 4 1,5 /path4 /path1,/path6 4 4 2,5 /path5 /path2,/path6 5 5 3,1 /path6 /path3,/path1 6 7 2,5 /path7 /path2,/path6
这种方法提供了一种更显式地控制查找逻辑的方式,尤其是在需要处理查找键不存在的情况时。
# 1. 创建Ref到URL的查找Series (同方法一)
s = df.drop_duplicates('Ref').astype({'Ref': str}).set_index('Ref')['URL']
# 2. 使用列表推导式进行查找和合并
df['options_url1_v2'] = [
','.join(s.get(y) for y in x.split(',') if y in s)
for x in df["Option1_Ref"]
]
print("\n方法二结果DataFrame:")
print(df)输出结果:
方法二结果DataFrame: Ref Option1_Ref URL options_url1 options_url1_v2 0 1 2,3,4 /path1 /path2,/path3,/path4 /path2,/path3,/path4 1 2 1,4,5 /path2 /path1,/path4 /path1,/path4 2 3 1,6 /path3 /path1 /path1 3 4 1,5 /path4 /path1,/path6 /path1,/path6 4 4 2,5 /path5 /path2,/path6 /path2,/path6 5 5 3,1 /path6 /path3,/path1 /path3,/path1 6 7 2,5 /path7 /path2,/path6 /path2,/path6
可以看到,两种方法的结果完全一致。
本文详细介绍了在Pandas DataFrame中根据关联ID列表聚合多行数据并合并为逗号分隔列的两种高效方法。无论是利用explode、map和groupby的Pandas原生矢量化操作,还是结合列表推导式与Series.get()进行更精细的控制,都能有效避免低效的行级循环,显著提升数据处理的性能和代码的专业性。在实际应用中,根据数据集规模和具体需求选择最合适的方法,将有助于构建更健壮、高效的数据处理流程。
以上就是Pandas教程:高效聚合多行数据并合并为逗号分隔列的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号