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

如何用Pandas的concat替代append实现DataFrame数据合并?

问题

我编写了如下函数,但Pandas的.append方法将在未来版本中被移除,因此希望将代码转换为使用concat实现。

def MyDF(self,DF1,DF2):
    OutputDf = pd.DataFrame([]).reset_index(drop=True)
    for i in range(0,len(DF2)):
        OutputDf = OutputDf.append(DF2.loc[[i]])
        OutputDf = OutputDf.append(DF1.loc[(DF1['TheName'] == DF2['TheName'][i]) & (DF1['WGT'].apply(lambda x: float(x)) > 0) ])
        OutputDf = OutputDf.reset_index(drop=True)
    return OutputDf

我不知道在此场景下如何使用concat,请问该如何替换掉.append方法?我不确定以下写法是否可行:

OutputDf = pd.Concat(OutputDf,DF2.loc[[i]])

解决方案

1. 纠正你的concat写法错误

你写的pd.Concat(OutputDf,DF2.loc[[i]])有两个问题:

  • Pandas的拼接函数是小写的pd.concat,不是大写开头的pd.Concat
  • concat需要接收一个DataFrame的列表作为参数,不能直接传两个单独的DataFrame

正确的单次拼接写法应该是:

OutputDf = pd.concat([OutputDf, DF2.loc[[i]]], ignore_index=True)

其中ignore_index=True可以直接替代你每次调用的reset_index(drop=True),自动重置索引。

2. 优化整个函数的效率

原代码在循环里每次拼接都会生成新的DataFrame,效率较低。更优的方式是先把所有需要拼接的片段收集到一个列表里,最后一次性执行concat,能大幅提升性能:

def MyDF(self, DF1, DF2):
    # 提前把DF1的WGT列转成数值类型,避免循环内重复转换
    DF1['WGT'] = DF1['WGT'].astype(float)
    # 初始化列表存储所有要拼接的片段
    df_list = []
    for i in range(len(DF2)):
        # 添加DF2的当前行
        df_list.append(DF2.loc[[i]])
        # 添加DF1中符合条件的行
        mask = (DF1['TheName'] == DF2['TheName'][i]) & (DF1['WGT'] > 0)
        df_list.append(DF1.loc[mask])
    # 一次性拼接所有片段并重置索引
    OutputDf = pd.concat(df_list, ignore_index=True)
    return OutputDf

额外优化点

  • 原循环中重复用apply(lambda x: float(x))转换WGT,提前转成数值类型能减少计算量
  • range(len(DF2))默认从0开始,比range(0, len(DF2))更简洁

内容的提问来源于stack exchange,提问作者TourEiffel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:35:40