如何将包含多组不同列数据的单行拆分为多行,可否通过ArcPy实现
实现方案
方案1:纯Python+pandas实现(最便捷)
这个需求本质是宽表转长表的固定分组拆分,用pandas处理非常简单,步骤如下:
- 先读取源数据(支持csv、excel等常见格式),如果是GIS属性表可以先导出为csv再处理
- 按固定分组步长拆分字段,你的场景里每组是4个属性(A/B/C/D)+1个Name,公共字段是ID和Date
- 遍历每个分组,拼接公共字段生成分行后的新表
示例代码:
import pandas as pd # 读取源数据 df = pd.read_csv("你的源文件路径.csv") # 定义公共字段 common_cols = ['ID', 'Date'] # 定义每组的字段数量,你的场景每组是A/B/C/D + Name 共5个字段 group_size = 5 # 计算总共有多少组 group_count = 4 # 你示例里是4组,可根据实际数据调整 result = [] for idx in range(group_count): # 提取当前组的字段 group_cols = [f'A{idx+1}', f'B{idx+1}', f'C{idx+1}', f'D{idx+1}', f'Name{idx+1}'] # 拼接公共字段+当前组字段生成子表 temp_df = df[common_cols + group_cols].copy() # 重名字段为统一格式,方便后续合并 temp_df.columns = ['ID', 'A', 'B', 'C', 'D', 'Name', 'Date'] result.append(temp_df) # 合并所有子表 final_df = pd.concat(result, ignore_index=True) # 导出结果 final_df.to_csv("拆分后结果.csv", index=False)
如果你的字段名不是按序号命名的,只要调整group_cols的提取逻辑即可,核心逻辑就是按固定步长取对应列,拼接公共字段后合并。
方案2:ArcPy原生实现(适配ArcGIS工作流)
如果你需要直接在ArcGIS环境里处理矢量要素的属性表,不需要导出到外部,可以用ArcPy的游标实现:
import arcpy # 源要素类路径 input_fc = r"你的矢量数据路径.shp" # 输出要素类路径 output_fc = r"输出路径_拆分后.shp" # 先复制源要素类的结构,只保留需要的字段:ID、A、B、C、D、Name、Date,以及SHAPE字段 arcpy.CreateFeatureclass_management(out_path=arcpy.os.path.dirname(output_fc), out_name=arcpy.os.path.basename(output_fc), template=input_fc, spatial_reference=input_fc) # 删掉多余字段,只保留目标字段 keep_fields = ['ID', 'A', 'B', 'C', 'D', 'Name', 'Date'] for field in [f.name for f in arcpy.ListFields(output_fc)]: if field not in keep_fields and field not in ['OBJECTID', 'Shape']: arcpy.DeleteField_management(output_fc, field) # 定义源字段分组 source_groups = [ ['A1', 'B1', 'C1', 'D1', 'Name1'], ['A2', 'B2', 'C2', 'D2', 'Name2'], ['A3', 'B3', 'C3', 'D3', 'Name3'], ['A4', 'B4', 'C4', 'D4', 'Name4'] ] # 用插入游标写输出 with arcpy.da.InsertCursor(output_fc, ['SHAPE@'] + keep_fields) as insert_cursor: # 遍历源要素 with arcpy.da.SearchCursor(input_fc, ['SHAPE@', 'ID', 'Date'] + [col for group in source_groups for col in group]) as search_cursor: for row in search_cursor: shape = row[0] id_val = row[1] date_val = row[2] # 遍历每个分组生成新行 for i, group in enumerate(source_groups): # 提取当前组的字段值,偏移量是3:前三个是SHAPE、ID、Date start_idx = 3 + i * 5 a_val = row[start_idx] b_val = row[start_idx+1] c_val = row[start_idx+2] d_val = row[start_idx+3] name_val = row[start_idx+4] # 插入新行 insert_cursor.insertRow([shape, id_val, a_val, b_val, c_val, d_val, name_val, date_val])
这个方案会保留原始要素的几何信息,拆分后每个新行对应一个独立要素,完全适配ArcGIS的工作流,不需要切换工具。
补充说明
如果你的分组数量不固定,可以先读取源表的字段名,按字段命名规则自动识别分组数量,不需要手动写死group_count或者source_groups。
内容的提问来源于stack exchange,提问作者huj35
相关产品推荐
相关产品推荐

