Como faço para juntar tabelas à esquerda com relação 1: n, enquanto mantenho o número de linhas igual ao da tabela esquerda e concatenando quaisquer dados duplicados com um caractere / string como ';'
Exemplo:
Tabela de Países
CountryID Country Area
1 UK 1029
2 Russia 8374
Tabela das cidades
CountryID City
1 London
1 Manchester
2 Moscow
2 Ufa
Eu quero:
CountryID Country Area Cities
1 UK 1029 London;Manchester
2 Russia 8374 Moscow;Ufa
Eu sei como fazer uma junção à esquerda normal
country.merge(city, how='left', on='CountryID')
o que me dá quatro linhas em vez de duas:
Area Country CountryID City
1029 UK 1 London
1029 UK 1 Manchester
8374 Russia 2 Moscow
8374 Russia 2 Ufa
Use map
por Series
criado por groupby
+ join
para uma nova coluna em df1
se o desempenho for importante:
df1['Cities'] = df1['CountryID'].map(df2.groupby('CountryID')['City'].apply(';'.join))
print (df1)
CountryID Country Area Cities
0 1 UK 1029 London;Manchester
1 2 Russia 8374 Moscow;Ufa
Detalhe :
print (df2.groupby('CountryID')['City'].apply(';'.join))
CountryID
1 London;Manchester
2 Moscow;Ufa
Name: City, dtype: object
Outra solução com join
:
df = df1.join(df2.groupby('CountryID')['City'].apply(';'.join), on='CountryID')
print (df)
CountryID Country Area City
0 1 UK 1029 London;Manchester
1 2 Russia 8374 Moscow;Ufa
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras