Поиск с использованием программно созданной строки индекса в Python/QGIS?

Я пытаюсь добавить данные в шейп-файл на основе таблицы поиска. Таким образом, и шейп-файл, и таблица поиска имеют значения для свойств земли, дождя и почвы, а таблица поиска также содержит значения для других переменных, которые я хочу добавить в свой шейп-файл на основе значений землепользования / дождя / почвы. Это то, что я бы с уверенностью делал в R, но это должно быть на python, поскольку этот язык используется в QGIS, а я новичок в python.

На данный момент я упростил проблему, просто работая с фреймами данных pandas в python:

import pandas as pd

#1. sample data
landuses = ['Pasture', 'Pasture', 'Stonefruit', 'Vineyard']
soils = [90, 120, 150, 90]
rainfalls = [350, 450, 550, 650]

sample_dict = {'landuse' : landuses,
            'soil' : soils,
           'rain' : rainfalls}

sample_df = pd.DataFrame(sample_dict)
print(sample_df)

# 2. lookup table data
v1 = [1,2,3,4]
v2 = [5,6,7,8]
v3 = [9,10,11,12]

lookup_dict = {'landuse' : landuses,
            'soil' : soils,
           'rain' : rainfalls,
           'v1' : v1,
           'v2' : v2,
           'v3' : v3}
lookup_df = pd.DataFrame(lookup_dict)
print(lookup_df)

Очевидно, что в обеих таблицах будет намного больше данных, но, надеюсь, вы поняли идею. Поэтому мне нужны значения v1, v2 и v3 в sample_df на основе сопоставления всех landuse, soil и rain. Я пробовал различные решения, связанные с np.logical_and()и несколько других подобных вещей, и мы смогли заставить это работать для упрощенных версий, но не для добавления значения для таблицы. Я не буду больше утомлять вас подробностями моих неудачных попыток, но я думаю, что лучшим решением (по крайней мере для моего уровня программирования на Python) будет создание строки индекса, объединяющей landuse, rain и soilзначения для каждой строки и соответствие между таблицами на основе этого. Так, например, строка для первой строки sample_df было бы 'Pasture 90 350', который я могу добавить в обе таблицы, а затем использовать в качестве индекса.

Однако, когда я пытаюсь создать строку индекса, используя:

sample_df['index'] = sample_df['landuse'] + " " + str(sample_df['rain']) + " " + str(sample_df['soil'])

Он включает в себя все ценности для soil и rain в строку, чего я не хочу.

А также, когда я провел тестовый запуск следующего шага, используя простой числовой индексный ключ:

sample_df['index1'] = [1,2,3,4]
lookup_df['index1'] = [1,2,3,4]

sample_df['v1'] = lookup_df[lookup_df['index1'] == sample_df['index1']]
print(sample_df)

В lookup_df[lookup_df['index1'] == sample_df['index1']] часть работает сама по себе, а назначение - нет.

Может кто-нибудь мне помочь? Я предполагаю, что решение предполагает использование .assign (который, как я понимаю, эквивалентен Python mutate()в R), но я не смог понять это. Спасибо заранее за любую помощь!

0 ответов

Другие вопросы по тегам