Obdoba arcpy funkce pivot v knihovně pandas

289
0
02-08-2023 01:01 AM
Labels (1)
MartinKrál
Esri Contributor
0 0 289

ArcGIS Pro v licenci Advanced obsahuje v toolboxu pro správu dat funkci Pivot, kterou je možné použít ke změně struktury tabulky v geodatabázi. Tato funkce redukuje redundantní záznamy na úkor rozšíření o nové sloupce (názorně viz obrázek).

MartinKrl_0-1675775202607.png

 

I když nemáme k dispozici licenci Advanced, je možné experimentovat s obdobou této funkce v python knihovně pandas: pandas.DataFrame.pivot_table. Jen pro převod tabulky do pandas.DataFrame (tabulky v pandas) potřebujeme provést konverzi tabulky přes numpy array, tedy:

 

Tabulka v geodatabázi--(arcpy.da.TableToNumPyArray)-->numpy array --> pandas.DataFrame 

 

a následně po provedení funkce pivot_table je potřeba konverzi provést zase obráceně přes numpy.array do tabulky v geodatabázi pomocí arcpy.da.NumPyArrayToTable. Jen je ještě potřeba definovat novou strukturu sloupců ve vstupním numpyarray.

Například pro výše uvedenou ukázku na obrázku je možné dosáhnout obdobného výsledku následujícím způsobem:

 

 

import arcpy
import numpy as np
import pandas as pd

#vstupni parametry
input="F:\\UKOLY\\F2\\PYTHON\\DATA.gdb\\LONG"
output="F:\\UKOLY\\F2\\PYTHON\\DATA.gdb\\SHORT"
inputCol=['EntID', 'LinkType']
pivotCol=['TableID']
valueCol=['LinkValue']

#prevod vstupni tabulky do numpy array
numpyarray = arcpy.da.TableToNumPyArray(input, tuple(inputCol+pivotCol+valueCol))

#prevod z numpy do pandas dataframe
df=pd.DataFrame(numpyarray)

#obdoba funkce pivot v knihovne pandas 
pivoted = pd.pivot_table(df, values=valueCol[0], index=inputCol, columns=pivotCol, aggfunc='first')

#pridani sloupcu indexu z pivot funkce do tabulky
pivoted=pivoted.reset_index()

#z pandy do numpy
numpyarray_pivoted=pivoted.to_numpy()

#mapovani typu sloupcu z nove tabulky do numpyarray
numpyarraydtype=numpyarray.dtype
dtypelist=[]
for column in pivoted.columns:
	if (column in numpyarraydtype.names):
		dtypelist.append((column , numpyarraydtype[numpyarraydtype.names.index(column)]))
	else:
		dtypelist.append((column , numpyarraydtype[valueCol[0]]))

#prevod z listu na tuple s novou definici sloupcu 
numpyarray_pivot_tuples=np.empty((numpyarray_pivoted.shape[0],), dtype=np.dtype(dtypelist))
numpyarray_pivot_tuples[:]=[tuple(i) for i in numpyarray_pivoted]

#ulozeni vysledne tabulky do geodatabaze
arcpy.da.NumPyArrayToTable(numpyarray_pivot_tuples, output)

 

 

 

Funkce pivot_table v pandas agreguje hodnoty ze sloupce values podle sloupců index a pivot, a tedy případné duplicity přes skupinu těchto (zde 3) sloupců pro pivoting vyloučí. (Uloží buď výsledek zadané agregační funkce, nebo v našem případě první nalezenou hodnotu z agregované skupiny.) Pokud bychom chtěli uživatele na tyto duplicity spíše upozornit, než je vyloučit, je možné použít  funkci pandas.DataFrame.pivot, která výsledky neagreguje, ale u případné duplicity vrátí chybu: Index contains duplicate entries, cannot reshape.