TransWikia.com

How to specify fields to use in a merge

Geographic Information Systems Asked on September 27, 2021

I am using arcpy to merge multiple feature classes from a list of feature classes. They all have the same fields. Let’s say they all have the fields = ['CO_FIPS', 'MILES', 'FLOOD_ZONE', 'VALID', 'REGION']. However, I only want to include ‘CO_FIPS’, ‘MILES’, and ‘FLOOD_ZONE’ in the output merged feature class. It seems I need to use field mapping to limit the fields in my output, but I am not 100% how to do that:

working_dir = r"C:ProjectsMyProjstream_lines.gdb"
arcpy.env.workspace = working_dir
s_studies_for_merge = ['stream1', 'stream2', 'stream3', ... 'stream10']
fieldMappings = arcpy.FieldMappings()
merged_output = os.path.join(working_dir, "AllStreams")
fieldMappings.addTable('stream1')

for field in fieldMappings.fields:
  if field.name not in ['CO_FIPS', 'MILES', 'FLOOD_ZONE']:
   fieldMappings.removeFieldMap(fieldMappings.findFieldMapIndex(field.name))    
arcpy.Merge_management(s_studies_for_merge, merged_output, fieldMappings)

My confusion is mainly that most examples show only 2 features being merged and that the mapping involves settings that I don’t need for certain fields. I only want to exclude the fields I don’t want and keep the fields I do. What do I need to do here?

UPDATE
I tried applying the below answer(@geodranic) this way (assuming I needed to iterate and add field mapping for each of the 10 feature classes in my s_studies_for_merge list):

mappings = arcpy.FieldMappings()
fields = ['REACH_ID', 'STUDY_ID', 'CID', 'FLD_ZONE', 'VALIDATION_STATUS', 'STATUS_TYP', 'MILES', 'STATUS_DATE', 'STUDY_TYPE', 'LINE_TYPE', 'BS_ZONE', 'BS_STDYTYP', 'PRELIM_DATE']
for item in s_studies_for_merge:
    print(item)
    for field in fields:
        print(field)
        map = arcpy.FieldMap()
        map.addInputField(item, field)
arcpy.Merge_management(s_studies_for_merge, s_studs, mappings)

I got an error that the merge failed because of one of the fields I didn’t want included in the merge:

ExecuteError: ERROR 001156: Failed on input OID 1, could not write value 'VIII' to output field FEMA_Region
Failed to execute (Merge)

How can I apply this correctly?

One Answer

Just drop the fields

fields_to_drop = ['junkfield', 'junkfield', 'junkfield', 'junkfield']
arcpy.DeleteField_management(your_featureclass, fields_to_drop)

if you don't know what fields are going to be there, you can generate a list of fieldnames, along with a list of your kept ones

keepers = ['goodstuff', 'goodstuff1', goodstuff2']
badstuff = [f for f in arcpy.ListFields(your_featureclass) if not f in keepers]

now just delete your badstuff list

arcpy.DeleteField_management(your_featureclass, badstuff)

Since you mention you need to drop during merge

keepers = ['CO_FIPS', 'MILES', 'FLOOD_ZONE']
mappings = arcpy.FieldMappings()
for field in keepers:
    map = arcpy.FieldMap()
    map.addInputField(yourfeatureclass, field)
    mappings.addFieldMap(map)

arcpy.Merge_management(s_studies_for_merge, merged_output, mappings)

Answered by geodranic on September 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP