如何在lambda表达式中高效拼接Python Pandas DataFrame?
Pandas分组处理后高效合并Series到DataFrame实现方案
原有写法问题说明
- 第一种
apply内调用pd.concat的写法无效,核心原因是pd.concat没有inplace参数,每次调用只会返回新的DataFrame对象,不会修改外部定义的空aggregate_frame,生成的临时对象没有被接收就会被直接回收,得不到预期结果。 - 第二种循环逐次
concat的写法性能极差:每次执行concat都会全量拷贝已有DataFrame,随着数据量增长耗时会呈平方级上升,完全不适合大规模数据集场景。
最优实现方案
你不需要逐次追加拼接,直接利用groupby.apply的原生返回逻辑即可,pandas会自动把每个分组返回的Series合并为最终的DataFrame,全程只做一次内存分配,性能和原生迭代一致:
import pandas as pd def aggregate_function(group_item) -> pd.Series: # 保留原有的分组处理逻辑即可 ... process group_item ... return processed_series # 直接接收apply返回结果,无需提前初始化空DataFrame逐行追加 aggregate_frame = other_frame.groupby('col_name').apply( aggregate_function, include_groups=False # pandas2.2+版本加该参数避免分组键重复传入处理函数,低版本可省略 )
如果不需要将分组键作为结果的索引,直接在末尾链式调用.reset_index(drop=True)即可。
特殊场景兼容方案
如果你的聚合逻辑包含条件判断,不是所有分组都需要加入最终结果,也不要逐次拼接DataFrame,先把符合条件的Series存入列表,最后一次性合并即可:
result_series_list = [] for _, group_item in other_frame.groupby('col_name'): processed_res = aggregate_function(group_item) # 自定义过滤逻辑 if 符合保留条件: result_series_list.append(processed_res) # 最后一次性完成拼接,仅做一次内存拷贝 aggregate_frame = pd.concat(result_series_list, axis=1).T
注意:所有需要批量合并多个Series/DataFrame的场景,都要优先收集所有待合并对象后一次性调用
pd.concat,避免循环内反复执行拼接操作带来的不必要性能损耗。
内容的提问来源于stack exchange,提问作者WolfiG
相关产品推荐
相关产品推荐

