如何用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
相关产品推荐
相关产品推荐

