Python Pandas mescla apenas algumas colunas


109

É possível mesclar apenas algumas colunas? Eu tenho um DataFrame df1 com colunas x, y, z e df2 com colunas x, a, b, c, d, e, f, etc.

Quero mesclar os dois DataFrames em x, mas só quero mesclar as colunas df2.a, df2.b - não o DataFrame inteiro.

O resultado seria um DataFrame com x, y, z, a, b.

Eu poderia mesclar e excluir as colunas indesejadas, mas parece que existe um método melhor.


1
Andy: Caramba, isso foi fácil ... Eu preciso de uma pausa, obviamente estou tornando isso muito complicado. Obrigado pela clareza!
BubbleGuppies

Respostas:


81

Você pode mesclar o sub-DataFrame (apenas com essas colunas):

df2[list('xab')]  # df2 but only with columns x, a, and b

df1.merge(df2[list('xab')])

6
Hmmm, eu me pergunto se deveria haver uma maneira nativa de fazer isso, como subconjunto no dropna ... reunirei o problema do github
Andy Hayden

Hmmm ... Eu tentei usar isso para mesclar a coluna 'Unique_External_Users' de df2 para df1, mas recebi um erro ... "Nenhum de [Index (['U', 'n', 'i', 'q', 'u ',' e ',' ',' E ',' x ',' t ',' e ',' r ',' n ',' a ', \ n' l ',' ',' U ', 's', 'e', ​​'r', 's'], \ n dtype = 'objeto')] estão nas [colunas] ".
CoolDocMan

Aqui está o código. ... df1.merge (df2 ('Unique_External_Users')])
CoolDocMan

1
@CoolDocMan Acho que você perdeu algo da resposta proposta: list('xab')pega cada elemento (letra) da string 'xab' e converte em um elemento de lista para list('xab')retornar ['x', 'a', 'b']. Isso funciona se cada coluna tiver uma única letra como nome. No seu caso, acho que você precisa fazer df1.merge (df2 ['Unique_External_Users'], * other_arguments). ... Provavelmente você já resolveu agora, apenas deixando isso para novatos por aí, como eu
SOf_PUAR

114

Você deseja usar DOIS colchetes, então, se estiver fazendo um tipo de ação VLOOKUP:

df = pd.merge(df,df2[['Key_Column','Target_Column']],on='Key_Column', how='left')

Isso lhe dará tudo no df + add original aquela coluna correspondente no df2 que você deseja unir.


11

Se você deseja descartar coluna (s) do quadro de dados de destino, mas as colunas são necessárias para a junção, você pode fazer o seguinte:

df1 = df1.merge(df2[['a', 'b', 'key1']], how = 'left',
                left_on = 'key2', right_on = 'key1').drop('key1')

A .drop('key1')parte impedirá 'key1' de ser mantida no quadro de dados resultante, apesar de ser necessária a junção em primeiro lugar.


4
Eu recebo o seguinte erro se tentar fazer isso:KeyError: "['key1'] not found in axis"
Tanya Branagan

3
tente .drop (colunas = ['key1'])
psangam

Ou .drop ('key1', axis = 1)
tonneofash

8

Você pode usar .locpara selecionar as colunas específicas com todas as linhas e puxar isso. Um exemplo está abaixo:

pandas.merge(dataframe1, dataframe2.iloc[:, [0:5]], how='left', on='key')

Neste exemplo, você está mesclando dataframe1 e dataframe2. Você optou por fazer uma junção externa à esquerda na 'chave'. No entanto, para dataframe2 você especificou, o .ilocque permite especificar as linhas e colunas que deseja em um formato numérico. Usando :, você seleciona todas as linhas, mas [0:5]seleciona as 5 primeiras colunas. Você poderia usar .locpara especificar por nome, mas se estiver lidando com nomes de coluna longos, .iloctalvez seja melhor.


1
Cuidado, pois .locisso fará uma cópia , e em um grande df isso pode ser doloroso. Pode ser melhor mesclar, em seguida, tomar imediatamente uma fatia de coluna na mesma expressão.
smci

7

Isso serve para mesclar colunas selecionadas de duas tabelas.

Se table_1contém t1_a,t1_b,t1_c..,id,..t1_zcolunas e table_2contém t2_a, t2_b, t2_c..., id,..t2_zcolunas, e apenas t1_a, id, t2_a são necessários na tabela final, então

mergedCSV = table_1[['t1_a','id']].merge(table_2[['t2_a','id']], on = 'id',how = 'left')
# save resulting output file    
mergedCSV.to_csv('output.csv',index = False)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.