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.

BubbleGuppies
fonte
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')])
Andy Hayden
fonte
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.

Arthur D. Howland
fonte
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.

tonneofash
fonte
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.

Terrance DeJesus
fonte
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)
Marco167
fonte