You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 05:15:31