基于Pandas的超大数据集分组后多字段唯一/全量值拼接需求
超大规模Pandas分组拼接高效解决方案
原始数据集(5亿行规模)
import pandas as pd import numpy as np df = pd.DataFrame({ 'Name': ['A','A','A','A','B','B','B','B'], 'Pair': ['b','c','d','e','b','f','d','g'], 'List 1': ['1,2','2,3,4',np.nan,'5',np.nan,'1,2,3','3,6','5,4'], 'List 2': ['1,2,3',',3,4','3','4,5',np.nan,'1,3','1,3,6','5,4'] })
处理需求
按Name字段分组完成以下操作:
- Unique Pair:提取分组内唯一的Pair字符,排序后用逗号拼接
- Unique List 1/2 Item:拆分List 1、List 2字段,去除空值后提取唯一元素,排序拼接
- All List 1/2 Item:拆分List 1、List 2字段,保留所有元素(含重复),排序拼接
高效实现代码
针对5亿行的超大规模数据,避免用自定义apply循环,全程用Pandas矢量化+分组聚合的底层优化API:
1. 预处理List字段(处理空值+过滤无效元素)
# 替换NaN为空字符串,拆分后过滤空元素(比如原数据中',3,4'拆分出的空字符串) for col in ['List 1', 'List 2']: df[col] = df[col].fillna('').str.split(',') df[col] = df[col].apply(lambda x: [i for i in x if i])
2. 分组聚合(核心高效逻辑)
# 定义聚合函数,均为批量处理逻辑 def unique_sorted_join(series): # 合并所有子列表→去重→排序→拼接 unique_vals = sorted(set(item for sublist in series for item in sublist)) return ','.join(unique_vals) def all_sorted_join(series): # 合并所有子列表→排序→拼接(保留重复) all_vals = sorted(item for sublist in series for item in sublist) return ','.join(all_vals) def pair_unique_sorted_join(series): # Pair字段直接去重排序拼接 return ','.join(sorted(series.unique())) # 分组聚合,用**语法明确映射字段 out = df.groupby('Name').agg( **{ 'Unique Pair': ('Pair', pair_unique_sorted_join), 'Unique List 1 Item': ('List 1', unique_sorted_join), 'All List 1 Item': ('List 1', all_sorted_join), 'Unique List 2 Item': ('List 2', unique_sorted_join), 'All List 2 Item': ('List 2', all_sorted_join) } ).reset_index()
3. 预期输出结果
# 最终输出与预期一致 print(out) # 预期输出结构: out_expected = pd.DataFrame({ 'Name': ['A','B'], 'Unique Pair': ['b,c,d,e','b,d,f,g'], 'Unique List 1 Item': ['1,2,3,4,5','1,2,3,4,5,6'], 'All List 1 Item': ['1,2,2,3,4,5','1,2,3,3,4,5,6'], 'Unique List 2 Item': ['1,2,3,4,5','1,3,4,5,6'], 'All List 2 Item': ['1,2,3,3,3,4,4,5','1,1,3,3,4,5,6'] })
性能说明
- 全程使用Pandas底层优化的矢量化操作,避免Python层面的逐行循环
groupby.agg批量处理分组,比逐组apply效率提升数倍- 拆分与过滤操作均为轻量逻辑,适合超大规模数据处理
内容的提问来源于stack exchange,提问作者Derek
相关产品推荐
相关产品推荐

