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

如何将包含多组不同列数据的单行拆分为多行,可否通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:06:04