1
resposta

Juntando um df com um gdf para fazer um choropleth

Eu tenho uma dataframa pandas com as seguintes series já tratas por mim: (100 rows)

Index(['Location', 'Farms', 'Disease', 'Export', 'Production_Load'], dtype='object')

E eu tenho uma dataframe GEOpandas com os polygons com as seguintes series, também ja tratadas: (700 rows)

Index(['Shape_Leng', 'Shape_Area', 'Loc_EN', 'Loc_VI', 'Prov_EN', 'Prov_VI',
       'geometry'],
      dtype='object')

Eu gostaria de ter um terceiro dataframe final - para plotar o choropleth após um MATCH entre as series LOCATION e Loc_VI que me traga as seguintes series:

df_final.columns= [Location, Farms, Disease, Export, Production_Load, goemetry]

Ou seja, eu preciso encontrar os 100 polygons na lista dos 700 para eu agregar as informações medidas e plotar o mapa!

Eu ainda não achei como construir esse filtro e deixa-lo funcionando redondo!

1 resposta

Olá Luiz, tudo bem? Espero que sim!

Desculpe pela demora em retornar.

Para realizarmos uma correspondência entre as series Location e Loc_VI, podemos utilizar o método merge() da biblioteca pandas. Basta acessarmos o método merge() através do primeiro dataframe, passando como primeiro argumento da função o segundo dataframe. Além disso, utilizaremos os parâmetros left_on e right_on para informarmos quaisos nomes das colunas que serão comparadas para que a correspondência seja feita. As colunas do seu exemplo serão 'Location' para o parâmetro left_on e 'Loc_VI' para o parâmetro right_on. Caso o nome das colunas fosse o mesmo, bastaria utilizar o argumento on, passando o nome em comum dos dois DataFrames. Por fim, precisamos utilizar o parâmetro how, que irá designar o tipo de correspondência entre os DataFrames. O tipo inner irá unir os DataFrames pegando somente as informações em comum dos dois DataFrames.

Para saber mais sobre o método merge(), confira a documentação da biblioteca pandas.

Para que fique mais claro, vou utilizar um exemplo simples da correspondência de dois DataFrames. Primeiramente, vamos criar o primeiro DataFrame com o seguinte código:

id = ['A001', 'A002', 'A003', 'A004', 'A005', 'A006', 'A007', 'A010']
localizacao = ['MG', 'SP', 'RJ', 'CE', 'RS', 'PE', 'PR', 'MS', 'SC', 'BA']
fazendas = ['Samambaia', 'Mato Grosso', 'Aconchego', 'Saci', 'Capão Grande', 'Santa Fé', 'Diná', 'Reunidos BH', 'Barreiro', 'Amaral']
producao_de_gado = [1500, 693, 12434, 122, 259, 80, 301, 3284, 77, 10]
dados_1 = pd.DataFrame(list(zip(id,localizacao, fazendas, producao_de_gado)), columns = ['ID','Localização', 'Nome Fazenda', 'Qtd Gado'])
dados_1

O código acima trará o seguinte resultado:

IDLocalizaçãoNome FazendaQtd Gado
0A001MGSamambaia1500
1A002SPMato Grosso693
2A003RJAconchego12434
3A004CESaci122
4A005RSCapão Grande259
5A006PESanta Fé80
6A007PRDiná301
7A010MSReunidos BH3284

Agora, vamos criar o segundo DataFrame, com o código a seguir:

id = ['A013', 'A014', 'A015', 'A004', 'A005', 'A006', 'A017', 'A020']
produtor = ['João', 'Millena', 'Afonso', 'Joana', 'Sthefanie', 'Danielle', 'Pedro', 'José', 'Lucas', 'Ferreira']
hectares_de_terra = [10, 500, 352, 10, 450, 222, 50, 30, 5, 250]
dados_2 = pd.DataFrame(list(zip(id,produtor, hectares_de_terra)), columns = ['ID_2','Nome Produtor', 'Hectares de Terra'])
dados_2

O código acima trará o seguinte resultado:

ID_2Nome ProdutorHectares de Terra
0A013João10
1A014Millena500
2A015Afonso352
3A004Joana10
4A005Sthefanie450
5A006Danielle222
6A017Pedro50
7A020José30

Para realizarmos a junção dos DataFrames através dos IDs, precisamos usar o método merge(), salvando o resultado em um terceiro DataFrame, nomeado df_inner:

df_inner = dados_1.merge(dados_2, left_on='ID', right_on='ID_2', how ='inner')
df_inner

O código acima trará o seguinte resultado:

IDLocalizaçãoNome FazendaQtd GadoID_2Nome ProdutorHectares de Terra
0A004CESaci122A004Joana10
1A005RSCapão Grande259A005Sthefanie450
2A006PESanta Fé80A006Danielle222

Repare que foi realizado a junção através das colunas ID e ID_2, mostrando apenas os IDs que estão em ambos os conjuntos de dados ao mesmo tempo. Podemos selecionar somente as colunas de interesse através de uma seleção do pandas, com o código:

df_inner[['ID', 'Nome Fazenda', 'Qtd Gado', 'Nome Produtor']]
df_inner

Que apresentará o resultado:

IDNome FazendaQtd GadoNome Produtor
0A004Saci122Joana
1A005Capão Grande259Sthefanie
2A006Santa Fé80Danielle

Você pode aplicar o método ao seu problema, fazendo as devidas adaptações.

Espero que tenha tirado sua dúvida.

Estou à disposição. Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!