Поиск с использованием программно созданной строки индекса в 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), но я не смог понять это. Спасибо заранее за любую помощь!