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
So panda can't merge if index column in one dataframe has the same name as another column in a second dataframe?
You need to explicitly specify how to join the table. By default, merge will choose common column name as merge key. For your case,
c.merge(orders, left_index=True, right_on='CustomID')
Also, read the docs of pandas.DataFrame.merge please.
Hope this would be helpful.
The join method does a left join by default (how='left') and joins on the indices of the dataframes.  So set the index of the orders dataframe to CustomerId and then join.
# 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
Alternatively, this merge will give you the same result.  Here, you are joining on the index of c (the left dataframe) and on the CustomerID column in the right dataframe.  Ensure to specify how='left' to only join items from the right dataframe to all of the records on the left (leaving an equivalent number of rows matching the length of c).  The default behavior for merge is an inner join, wherebe the result only includes those records from c that find a match in orders (although this could be your desired result).
c.merge(orders, left_index=True, right_on='CustomerID', how='left')
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With