使用pandas的append方法向DataFrame添加数据失败问题求助
问题原因
- 核心错误:pandas 的
DataFrame.append()方法不修改原始DataFrame对象,仅返回拼接后的新DataFrame。你的代码未将拼接结果赋值回df1,因此df1始终为空。 - 优化提示:你使用的
arcpy.SearchCursor是ArcPy已废弃的旧版游标接口,推荐使用性能更高、资源占用更优的arcpy.da.SearchCursor替代。
修复方案
最小修改版本
仅修改append行的赋值逻辑即可得到正确结果:
import arcpy from arcpy import env import pandas as pd # setting workspace env.workspace = r"C:\Users\4_projects\211104\Network.gdb" env.overwriteOutput = True # existing output will be overwritten buchs = r"buchs" rows = arcpy.SearchCursor(buchs) shapeName = arcpy.Describe(buchs).shapeFieldName df1 = pd.DataFrame() for row in rows: feat = row.getValue(shapeName) extent = feat.extent df2 = pd.DataFrame({"XMin": [extent.XMin], "YMin": [extent.YMin], "XMax": [extent.XMax], "YMax": [extent.YMax]}) # 新增赋值操作,将拼接后的新DataFrame赋值给df1 df1 = df1.append(df2, ignore_index=True)
注意:
DataFrame.append()方法已在pandas 2.0及以上版本中正式移除,如果你使用的是较新的pandas版本,请直接使用优化版本的方案。
更高效的优化版本
循环中频繁创建DataFrame并拼接会产生大量额外性能开销,推荐先将所有范围值存入列表,最后一次性转换为DataFrame,同时替换为新版游标接口:
import arcpy from arcpy import env import pandas as pd env.workspace = r"C:\Users\4_projects\211104\Network.gdb" env.overwriteOutput = True buchs = r"buchs" shape_name = arcpy.Describe(buchs).shapeFieldName # 先初始化列表存储所有范围数据 extent_list = [] # 使用新版da.SearchCursor遍历要素 with arcpy.da.SearchCursor(buchs, [shape_name]) as cursor: for row in cursor: extent = row[0].extent extent_list.append({ "XMin": extent.XMin, "YMin": extent.YMin, "XMax": extent.XMax, "YMax": extent.YMax }) # 一次性转换为DataFrame df1 = pd.DataFrame(extent_list)
该版本运行速度更快,尤其当要素数量较多时性能优势会非常明显。
内容的提问来源于stack exchange,提问作者Yves
相关产品推荐
相关产品推荐

