如何用pandas df.concat替代带自定义索引的.append方法?
替换Pandas已弃用的
.append方法(自定义索引场景) 问题背景
需要替换Pandas中即将弃用的.append方法,原代码读取目录下所有.shp文件,从文件名提取日期和自定义索引nom_parcelle,确保索引不重复后添加行到DataFrame。原代码逻辑正常,但用pd.concat替代时无法正确保留索引。
原代码:
df = pd.DataFrame(columns = ['date','fichier']) for i in glob.glob("*.shp"): nom_parcelle = i.split("_")[2] if not nom_parcelle in df.index: date_recolte = i.split("_")[-1] new_row = pd.Series(data={'date':date_recolte.split(".")[0], 'fichier':i}, name = nom_parcelle) df = df.append(new_row, ignore_index=False)
解决方案
核心是避免循环内重复拼接DataFrame,先收集所有符合条件的行(以Series或单行DataFrame形式),最后一次性用pd.concat合并,同时维护索引集合避免重复。
方法1:收集Series后合并
import pandas as pd import glob series_list = [] existing_indexes = set() for i in glob.glob("*.shp"): nom_parcelle = i.split("_")[2] if nom_parcelle not in existing_indexes: date_recolte = i.split("_")[-1] new_row = pd.Series( data={'date': date_recolte.split(".")[0], 'fichier': i}, name=nom_parcelle ) series_list.append(new_row) existing_indexes.add(nom_parcelle) # 合并所有Series并转置为行结构 df = pd.concat(series_list, axis=1).T
方法2:收集单行DataFrame后合并
import pandas as pd import glob df_list = [] existing_indexes = set() for i in glob.glob("*.shp"): nom_parcelle = i.split("_")[2] if nom_parcelle not in existing_indexes: date_recolte = i.split("_")[-1] # 创建带自定义索引的单行DataFrame new_df = pd.DataFrame( {'date': [date_recolte.split(".")[0]], 'fichier': [i]}, index=[nom_parcelle] ) df_list.append(new_df) existing_indexes.add(nom_parcelle) # 直接合并所有单行DataFrame df = pd.concat(df_list)
关键说明
- 避免循环内拼接:原代码循环中每次
.append都会生成新DataFrame,效率低下;先收集再一次性合并是Pandas推荐的高效写法。 - 索引去重逻辑:用
existing_indexes集合跟踪已添加的索引,和原代码逻辑完全一致,确保不会重复添加相同nom_parcelle的行。 - 索引保留:无论是Series的
name还是单行DataFrame的index,都能被pd.concat正确识别为最终DataFrame的索引,无需额外设置参数。
内容的提问来源于stack exchange,提问作者camced
相关产品推荐
相关产品推荐

