Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python/QGIS中使用编程创建的索引字符串进行查找?_Python_Indexing_Lookup_Qgis_Pyqgis - Fatal编程技术网

在python/QGIS中使用编程创建的索引字符串进行查找?

在python/QGIS中使用编程创建的索引字符串进行查找?,python,indexing,lookup,qgis,pyqgis,Python,Indexing,Lookup,Qgis,Pyqgis,我正在尝试基于查找表向shapefile添加数据。因此,shapefile和查找表都有土地利用、雨水和土壤特性的值,查找表也有其他变量的值,我想根据土地利用/雨水/土壤值将这些变量添加到shapefile中。这是我在R中非常有信心做的事情,但它需要在python中,因为这是QGIS中使用的语言,我对python非常陌生 目前,我通过在python中使用pandas数据帧简化了问题: import pandas as pd #1. sample data landuses = ['Pasture

我正在尝试基于查找表向shapefile添加数据。因此,shapefile和查找表都有土地利用、雨水和土壤特性的值,查找表也有其他变量的值,我想根据土地利用/雨水/土壤值将这些变量添加到shapefile中。这是我在R中非常有信心做的事情,但它需要在python中,因为这是QGIS中使用的语言,我对python非常陌生

目前,我通过在python中使用pandas数据帧简化了问题:

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
。我已经尝试了各种解决方案,包括
np.logical_和()
以及其他一些类似的东西,并且能够在简化版本中实现这一点,但不能为表添加值。到目前为止,我不会再让你厌烦我失败尝试的细节了,但我认为最好的解决方案(至少对于我的python编程水平而言)是创建一个索引字符串,将每行的
landuse
rain
soil
值结合起来,并基于此在表之间进行匹配。因此,例如,
sample_df
的第一行的字符串将是
'passeat90 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相当于R中的
mutate()
),但我还没有弄清楚。提前感谢您的帮助

我已经用
for
循环解决了问题的前半部分:
for lab,sample_-df.iterrows()中的行:
sample_-df.loc[lab,'index']=''.join([sample_-df.loc[lab,'landuse',
str sample_-df.loc[lab,'rain']),
str sample_-df loc[lab,'soil'])
(抱歉,不知道如何在注释中获得正确的代码块)并且意识到在我的上一个代码块中有一个很容易修复的错误(事后来看)(最后缺少
['v1']
):
sample_-df['v1']=lookup_-df[lookup_-df['index']==sample_-df['index']['v1']在我解决自己的问题之前,
会检查我的实际数据,但看起来不错。我已经用
for
循环解决了问题的前半部分:
for lab,sample_df.iterrows()中的行:
sample_df.loc[lab,'index']=”。join([sample_df.loc[lab,'landuse',
str(sample_df.loc[lab,'rain']),
str(sample_df.loc[lab,'soil']))
(抱歉,不知道如何在注释中获得正确的代码块)并且还意识到在我的上一个代码块中有一个很容易修复的错误(事后来看)(最后缺少
['v1']
):
sample_df['v1']=lookup_df['index']==sample_df['index']['v1']
将在我解决自己的问题之前检查所有这些在我的实际数据上的效果,但看起来不错。