La fusión de dos marcos de datos de pandas da como resultado columnas “duplicadas”

Estoy tratando de fusionar dos marcos de datos que contienen la misma columna clave. Algunas de las otras columnas también tienen encabezados idénticos, aunque no son un número igual de filas, y después de fusionar estas columnas se “duplican” con los encabezados originales a los que se les asignó una posdata _x, _y, etc.

¿Alguien sabe cómo hacer que los pandas eliminen las columnas duplicadas en el siguiente ejemplo?

Este es mi código python:

import pandas as pd holding_df = pd.read_csv('holding.csv') invest_df = pd.read_csv('invest.csv') merge_df = pd.merge(holding_df, invest_df, on='key', how='left').fillna(0) merge_df.to_csv('merged.csv', index=False) 

Y los archivos CSV contienen esto:

Primeras filas del dataframe izquierdo (holding_df)

 key, dept_name, res_name, year, need, holding DeptA_ResA_2015, DeptA, ResA, 2015, 1, 1 DeptA_ResA_2016, DeptA, ResA, 2016, 1, 1 DeptA_ResA_2017, DeptA, ResA, 2017, 1, 1 ... 

Right-dataframe (invest_df)

 key, dept_name, res_name, year, no_of_inv, inv_cost_wo_ice DeptA_ResA_2015, DeptA, ResA, 2015, 1, 1000000 DeptA_ResB_2015, DeptA, ResB, 2015, 2, 6000000 DeptB_ResB_2015, DeptB, ResB, 2015, 1, 6000000 ... 

Resultado fusionado

 key, dept_name_x, res_name_x, year_x, need, holding, dept_name_y, res_name_y, year_y, no_of_inv, inv_cost_wo_ice DeptA_ResA_2015, DeptA, ResA, 2015, 1, 1, DeptA, ResA, 2015.0, 1.0, 1000000.0 DeptA_ResA_2016, DeptA, ResA, 2016, 1, 1, 0, 0, 0.0, 0.0, 0.0 DeptA_ResA_2017, DeptA, ResA, 2017, 1, 1, 0, 0, 0.0, 0.0, 0.0 DeptA_ResA_2018, DeptA, ResA, 2018, 1, 1, 0, 0, 0.0, 0.0, 0.0 DeptA_ResA_2019, DeptA, ResA, 2019, 1, 1, 0, 0, 0.0, 0.0, 0.0 ... 

La razón por la que tiene columnas adicionales con los sufijos ‘_x’ y ‘_y’ es que las columnas que está fusionando no tienen valores coincidentes, por lo que este conflicto produce columnas adicionales. En ese caso, debe eliminar las columnas ‘_y’ adicionales y cambiar el nombre de las columnas ‘_x’:

 In [145]: # define our drop function def drop_y(df): # list comprehension of the cols that end with '_y' to_drop = [x for x in df if x.endswith('_y')] df.drop(to_drop, axis=1, inplace=True) drop_y(merged) merged Out[145]: key dept_name_x res_name_x year_x need holding \ 0 DeptA_ResA_2015 DeptA ResA 2015 1 1 1 DeptA_ResA_2016 DeptA ResA 2016 1 1 2 DeptA_ResA_2017 DeptA ResA 2017 1 1 no_of_inv inv_cost_wo_ice 0 1 1000000 1 0 0 2 0 0 In [146]: # func to rename '_x' cols def rename_x(df): for col in df: if col.endswith('_x'): df.rename(columns={col:col.rstrip('_x')}, inplace=True) rename_x(merged) merged Out[146]: key dept_name res_name year need holding no_of_inv \ 0 DeptA_ResA_2015 DeptA ResA 2015 1 1 1 1 DeptA_ResA_2016 DeptA ResA 2016 1 1 0 2 DeptA_ResA_2017 DeptA ResA 2017 1 1 0 inv_cost_wo_ice 0 1000000 1 0 2 0 

EDITAR Si agregó las columnas comunes a su combinación, entonces no debería producir las columnas duplicadas a menos que las coincidencias en esas columnas no coincidan:

 merge_df = pd.merge(holding_df, invest_df, on=['key', 'dept_name', 'res_name', 'year'], how='left').fillna(0) 

Tengo el mismo problema con las columnas duplicadas después de las combinaciones a la izquierda, incluso cuando los datos de las columnas son idénticos. Hice una consulta y descubrí que los valores de NaN se consideran diferentes incluso si ambas columnas son NaN en pandas 0.14. PERO una vez que actualiza a 0.15, este problema desaparece, lo que explica por qué más adelante le funciona, probablemente se actualizó.

No es exactamente la respuesta, pero pd.merge proporciona un argumento para ayudarte a decidir qué sufijos se deben agregar a tus columnas superpuestas:

 merge_df = pd.merge(holding_df, invest_df, on='key', how='left', suffixes=('_holding', '_invest')).fillna(0) 

Los nombres más significativos podrían ser útiles si decide mantener ambos (o para verificar por qué se mantienen las columnas).

Consulte la documentación para más referencia.