def Frequency(in_table, out_table, frequency_fields, summary_fields=None): """ Emulate Frequency_analysis geoprocessing tool Updated to use arcpy.da Usage is now same as Frequency_analysis However, argument checking is still not all that robust """ import arcpy gp = arcpy import arcpy.da as da # Create list of cursor fields if isinstance(frequency_fields, list): FreqFieldList = frequency_fields else: FreqFieldList = [ frequency_fields ] iNumFreqFields = len(FreqFieldList) if summary_fields is None: SumFieldList = [] elif isinstance(summary_fields, list): SumFieldList = summary_fields else: SumFieldList = [ summary_fields ] CursorFieldList = [] WidthList = [] for sField in FreqFieldList: CursorFieldList.append(sField) WidthList.append(0) for sField in SumFieldList: CursorFieldList.append(sField) iNumCursorFields = len(CursorFieldList) # Create summary values KeyList = [] SumTab = {} for row in sorted(da.SearchCursor(in_table, CursorFieldList)): # Build key sKey = "" for i in range(0, iNumFreqFields): val = row[i] sVal = str(val) iLen = len(sVal) if iLen > WidthList[i]: WidthList[i] = iLen if sKey == "": sKey = sVal else: sKey += "\t" + sVal # Get summary values if not SumTab.has_key(sKey): SumList = [1] KeyList.append(sKey) bNewEntry = True else: SumList = SumTab[sKey] SumList[0] = SumList[0] + 1 bNewEntry = False for i in range(iNumFreqFields, iNumCursorFields): if bNewEntry: SumList.append(row[i]) else: j = i - iNumFreqFields + 1 SumList[j] = SumList[j] + row[i] SumTab[sKey] = SumList # Create output table import os.path sOutWorkspace = os.path.dirname(out_table) sOutTabName = os.path.basename(out_table) gp.CreateTable_management(sOutWorkspace, sOutTabName) # gp.env.Workspace = sOutWorkspace OutFieldList = [] i = 0 for sField in FreqFieldList: OutFieldList.append(sField) iLen = WidthList[i] gp.AddField_management(out_table, sField, "text", "#", "#", str(iLen)) i += 1 gp.AddField_management(out_table, "Count", "long") OutFieldList.append("Count") for sField in SumFieldList: gp.AddField_management(out_table, sField, "double") OutFieldList.append(sField) # Populate output table c = da.InsertCursor(out_table, OutFieldList) for sKey in KeyList: row = [] ValList = sKey.split("\t") SumList = SumTab[sKey] for val in ValList: row.append(val) for val in SumList: row.append(val) c.insertRow(row) # All done!