pandas: mescla (junção) dois quadros de dados em várias colunas


168

Estou tentando juntar dois quadros de dados de pandas usando duas colunas:

new_df = pd.merge(A_df, B_df,  how='left', left_on='[A_c1,c2]', right_on = '[B_c1,c2]')

mas obteve o seguinte erro:

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4164)()

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4028)()

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13166)()

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13120)()

KeyError: '[B_1, c2]'

Alguma idéia de qual deve ser o caminho certo para fazer isso? Obrigado!


52
left_one right_ondeve ser uma lista de cadeias, não uma cadeia que se parece com uma lista.
root

Respostas:


311

Tente isto

new_df = pd.merge(A_df, B_df,  how='left', left_on=['A_c1','c2'], right_on = ['B_c1','c2'])

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html

left_on: rótulo ou lista ou nomes de campos semelhantes a matrizes para ingressar no DataFrame esquerdo. Pode ser um vetor ou uma lista de vetores do comprimento do DataFrame para usar um vetor específico como a chave de junção em vez de colunas

right_on: rótulo ou lista ou nomes de campos semelhantes a matrizes para ingressar no DataFrame direito ou vetor / lista de vetores por documentos left_on


8
Se left_one right_onsão iguais ae b, podemos usar on = ['a', 'b']?
ahbon 13/12/19

4
Sim, isso é perfeitamente válido.
user3065757

4

o problema aqui é que, usando os apóstrofos, você está definindo o valor que está sendo passado como uma string, quando, de fato, como @Shijo afirmou na documentação, a função espera um rótulo ou lista, mas não uma string! Se a lista contiver cada um dos nomes dos seres das colunas passados ​​para o quadro de dados esquerdo e direito, cada nome de coluna deverá estar individualmente dentro dos apóstrofos. Com o que foi afirmado, podemos entender por que isso é incorreto:

new_df = pd.merge(A_df, B_df,  how='left', left_on='[A_c1,c2]', right_on = '[B_c1,c2]')

E esta é a maneira correta de usar a função:

new_df = pd.merge(A_df, B_df,  how='left', left_on=['A_c1','c2'], right_on = ['B_c1','c2'])

3

Outra maneira de fazer isso: new_df = A_df.merge(B_df, left_on=['A_c1','c2'], right_on = ['B_c1','c2'], how='left')

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.