高效实现Pandas GroupBy分组内行信息合并(适配超大规模数据)
高效替代Pandas groupby+apply实现分组聚合的方案
现有实现与问题
当前通过groupby+apply实现分组后合并列信息、统计唯一值数量的代码如下:
import numpy as np import pandas as pd df = pd.DataFrame({"A" : ["a", "a", "b", "b", "a"], "B" : ["x", "y", "z", "w", "t"] }) groups = df.groupby("A") strings = groups["B"].apply(lambda x : "".join(sorted(x.values + " "))) strings2 = groups["B"].apply(lambda x : str(len(np.unique(x))) + "hello") print(strings) print(strings2)
输出结果:
a t x y b w z Name: B, dtype: object A a 3hello b 2hello Name: B, dtype: object
但apply属于非向量化操作,在百万级行、30万+分组(每组仅2-3行)的场景下,效率极低,需替换为更高效、空间友好的方案,支持直接基于原DataFrame处理。
高效解决方案
1. 分组合并排序后的B列(带空格分隔)
利用Pandas内置的向量化聚合操作,先排序再聚合,避免逐组Python循环:
import pandas as pd df = pd.DataFrame({"A" : ["a", "a", "b", "b", "a"], "B" : ["x", "y", "z", "w", "t"] }) # 给每个B列元素添加空格,匹配原代码输出格式 df['B_with_space'] = df['B'] + ' ' # 按分组键A和B列排序,保证合并后的字符串有序 df_sorted = df.sort_values(['A', 'B']) # 用agg执行高效的字符串拼接 strings_fast = df_sorted.groupby('A')['B_with_space'].agg(''.join) print(strings_fast)
输出与原代码完全一致:
a t x y b w z Name: B_with_space, dtype: object
2. 分组统计B列唯一值数量并拼接"hello"
直接使用Pandas优化后的nunique()方法,替代apply里的len(np.unique(x)):
strings2_fast = df.groupby('A')['B'].nunique().astype(str) + 'hello' print(strings2_fast)
输出与原代码完全一致:
A a 3hello b 2hello Name: B, dtype: object
直接基于原DataFrame处理(无需单独生成分组结果)
如果需要将聚合结果合并回原DataFrame,使用transform方法:
# 合并排序后的字符串到原DataFrame df['merged_B'] = df_sorted.groupby('A')['B_with_space'].transform(''.join) # 统计唯一值数量并拼接hello到原DataFrame df['count_hello'] = df.groupby('A')['B'].transform('nunique').astype(str) + 'hello' print(df)
输出:
A B B_with_space merged_B count_hello 0 a x x t x y 3hello 1 a y y t x y 3hello 2 b z z w z 2hello 3 b w w w z 2hello 4 a t t t x y 3hello
方案优势
- 全部采用Pandas内置的向量化操作,利用C级优化避免Python循环,大数据量下效率提升数倍甚至数十倍
- 内存占用更友好,无额外lambda函数的调用开销
- 代码简洁易维护,逻辑清晰
内容的提问来源于stack exchange,提问作者Maria C
相关产品推荐
相关产品推荐

