1 votos

Forma más rápida de agregar valores de un diccionario a una tabla de atributos con PyQGIS3

Tengo un diccionario de Python con alrededor de 450,000 claves y valores respectivos. Quiero unir este diccionario a una tabla de atributos de un conjunto de datos vectoriales con aproximadamente la misma cantidad de entidades.

Primero creé un nuevo campo donde se almacenarán los valores y guardé su índice en una variable. También guardé el índice del campo a través del cual quiero unir los valores de las claves.

layer_prov = layer.dataProvider()
layer_prov.addAttributes([QgsField("nuevo_campo", QVariant.Double)])
layer.updateFields()
new_field_idx = layer.fields().indexFromName('nuevo_campo')
join_field_idx = layer.fields().indexFromName('campo_unir')

layer es el conjunto de datos vectoriales al que quiero unir la información del diccionario. dict es el diccionario.

for key, value in dict.items():
layer.startEditing()
for feature in layer.getFeatures():
    attrs = feature.attributes()
    join_value = (attrs[join_field_idx])
    join_value = str(join_value)
    if join_value == key:
        feature[new_field_idx] = value
layer.commitChanges()

¿Hay alguna forma de hacer esto más rápido? Para cada entrada en el diccionario, este modelo necesita recorrer todas las características del conjunto de datos vectoriales (450,000 x 450,000 = 202,500,000,000 comparaciones).

0voto

Markum Puntos 116

En lugar de comparar cada característica con las claves en el diccionario, guardé todo el diccionario como un archivo csv y simplemente utilicé el algoritmo de QGIS Unir Tabla de Atributos (¡probablemente también se juega su parte con SQL!?) para unir el csv al vector.

#crear csv desde el diccionario
os.chdir(Output_Ordner)
header_list = ["claves", "valores"]
habitat_vkp_sum_csv = open("key_value_csv.csv", "w")
writer = csv.writer(key_value_csv, delimiter=',', quotechar=',')
writer.writerow(header_list)
for key, value in dict.items():
    writer.writerow([key, value])
key_value_csv.close()

#realizar unión de tablas entre los datos vectoriales y la tabla csv
processing.run("native:joinattributestable", {
    'INPUT': layer,
    'FIELD': 'claves', 'INPUT_2': Output_Ordner+'\\'+'key_value_csv.csv', 'FIELD_2': 'claves',
    'FIELDS_TO_COPY': ['valores'], 'METHOD': 1, 'DISCARD_NONMATCHING': False, 'PREFIX': '',
    'OUTPUT': Output_Ordner+'\\'+'resultado'})

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X