Vinculando DataFrames

Limpeza de dados em Python

Adel Nehme

VP of AI Curriculum, DataCamp

Vinculação de registros

Limpeza de dados em Python

Vinculação de registros

Limpeza de dados em Python

Nossos DataFrames

census_A

             given_name  surname date_of_birth         suburb state  address_1
rec_id                                                                
rec-1070-org   michaela  neumann      19151111  winston hills   nsw  stanley street 
rec-1016-org   courtney  painter      19161214      richlands   vic  pinkerton circuit 
...

census_B

               given_name  surname date_of_birth             suburb state  address_1
rec_id                                                                      
rec-561-dup-0       elton      NaN      19651013         windermere   vic  light setreet 
rec-2642-dup-0   mitchell    maxon      19390212         north ryde   nsw  edkins street 
...
Limpeza de dados em Python

O que já fizemos

# Importar recordlinkage e gerar todos os pares
import recordlinkage
indexer = recordlinkage.Index()
indexer.block('state')
full_pairs = indexer.index(census_A, census_B)

# Etapa de comparação compare_cl = recordlinkage.Compare() compare_cl.exact('date_of_birth', 'date_of_birth', label='date_of_birth') compare_cl.exact('state', 'state', label='state') compare_cl.string('surname', 'surname', threshold=0.85, label='surname') compare_cl.string('address_1', 'address_1', threshold=0.85, label='address_1')
potential_matches = compare_cl.compute(full_pairs, census_A, census_B)
Limpeza de dados em Python

O que estamos fazendo agora

Limpeza de dados em Python

Nossas correspondências potenciais

potential_matches

Limpeza de dados em Python

Nossas correspondências potenciais

potential_matches

Limpeza de dados em Python

Nossas correspondências potenciais

potential_matches

Limpeza de dados em Python

Nossas correspondências potenciais

potential_matches

Limpeza de dados em Python

Correspondências prováveis

matches = potential_matches[potential_matches.sum(axis = 1) >= 3]
print(matches)

Limpeza de dados em Python

Correspondências prováveis

matches = potential_matches[potential_matches.sum(axis = 1) >= 3]
print(matches)

Limpeza de dados em Python

Obter os índices

matches.index
MultiIndex(levels=[['rec-1007-org', 'rec-1016-org', 'rec-1054-org', 'rec-1066-org', 
'rec-1070-org', 'rec-1075-org', 'rec-1080-org', 'rec-110-org', ...
# Obter índices apenas de census_B
duplicate_rows = matches.index.get_level_values(1)
print(census_B_index)
Index(['rec-2404-dup-0', 'rec-4178-dup-0', 'rec-1054-dup-0', 'rec-4663-dup-0',
       'rec-485-dup-0', 'rec-2950-dup-0', 'rec-1234-dup-0', ... , 'rec-299-dup-0'])
Limpeza de dados em Python

Vinculando DataFrames

# Encontrando duplicados em census_B
census_B_duplicates = census_B[census_B.index.isin(duplicate_rows)]

# Encontrando novas linhas em census_B census_B_new = census_B[~census_B.index.isin(duplicate_rows)]
# Vincular os DataFrames!
full_census = pd.concat([census_A, census_B_new])
Limpeza de dados em Python
# Importar recordlinkage, gerar pares e comparar colunas
...
# Gerar correspondências potenciais
potential_matches = compare_cl.compute(full_pairs, census_A, census_B)

# Isolar linhas com 3+ valores que batem matches = potential_matches[potential_matches.sum(axis = 1) >= 3]
# Obter o índice só das linhas de census_B duplicate_rows = matches.index.get_level_values(1)
# Encontrando novas linhas em census_B census_B_new = census_B[~census_B.index.isin(duplicate_rows)]
# Vincular os DataFrames! full_census = pd.concat([census_A, census_B_new])
Limpeza de dados em Python

Vamos praticar!

Limpeza de dados em Python

Preparing Video For Download...