In [88]: c Out[88]: Address Name CustomerID 10 Address for Mike Mike 11 Address for Marcia Marcia In [89]: c.index Out[89]: Int64Index([10, 11], dtype='int64', name='CustomerID') In [90]: orders Out[90]: CustomerID OrderDate 0 10 2014-12-01 1 11 2014-12-01 2 10 2014-12-01 In [91]: orders.index Out[91]: RangeIndex(start=0, stop=3, step=1) In [92]: c.merge(orders) --------------------------- MergeError: No common columns to perform merge on
¿Entonces panda no puede fusionarse si la columna de índice en un dataframe tiene el mismo nombre que otra columna en un segundo dataframe?
Debe especificar explícitamente cómo unirse a la tabla. De forma predeterminada, la merge
elegirá el nombre de columna común como clave de combinación. Para su caso,
c.merge(orders, left_index=True, right_on='CustomID')
Además, lea los documentos de pandas.DataFrame.merge
por favor. Espero que esto sea de ayuda.
El método de join
realiza una unión a la izquierda de manera predeterminada ( how='left')
y se une a los índices de los marcos de datos. Así que establezca el índice del dataframe de los orders
en CustomerId
y luego únase.
# Create sample data. orders = pd.DataFrame( {'CustomerID': [10, 11, 10], 'OrderDate': ['2014-12-01', '2014-12-01', '2014-12-01']}) c = pd.DataFrame( {'Address': ['Address for Mike', 'Address for Marcia'], 'Name': ['Mike', 'Marcia']}, index=pd.Index([10, 11], dtype='int64', name='CustomerID')) # Join. >>> c.join(orders.set_index('CustomerID')) Address Name OrderDate CustomerID 10 Address for Mike Mike 2014-12-01 10 Address for Mike Mike 2014-12-01 11 Address for Marcia Marcia 2014-12-01
Alternativamente, esta merge
te dará el mismo resultado. Aquí, se está uniendo en el índice de c
(el dataframe de la izquierda) y en la columna CustomerID
en el dataframe de la derecha. Asegúrese de especificar how='left'
para unir solo los elementos del dataframe derecho a todos los registros de la izquierda (dejando un número equivalente de filas que coincidan con la longitud de c
). El comportamiento predeterminado para la merge
es una unión interna, donde el resultado solo incluye los registros de c
que encuentran una coincidencia en los orders
(aunque este podría ser su resultado deseado).
c.merge(orders, left_index=True, right_on='CustomerID', how='left')
Intenta restablecer el índice:
c.reset_index().merge(orders)