#!/usr/bin/env python
# coding: utf-8

# # Unión de dataframes

# In[3]:


import pandas as pd


# In[13]:


#Generamos los sets de datos
clients = {'first_name' : ['Oralie' ,'Imojean' ,'Michele', 'Ailbert', 'Stevy'],
           'last_name' : ['Fidgeon' ,'Benet' ,'Woodlands', 'Risdale', 'MacGorman'],
           'age' : [30 ,21 ,29 ,22, 24]}
clients = pd.DataFrame(clients, columns = ['first_name', 'last_name', 'age'])
clients


# In[14]:


# Generamos ahora otro dataset con los importes pagados por los clientes (facturas)
invoices = {'invoice_id': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
            'client_id' : [3, 2, 7, 2, 7, 3, 1, 4 ,2, 3, 6, 2],
            'amount': [77.91, 24.36, 74.65, 19.75, 27.46, 17.13, 45.77, 81.7, 14.41, 52.69, 32.03, 12.78]}
invoices = pd.DataFrame(invoices, columns = ['invoice_id', 'client_id', 'amount'])
invoices


# ## Añadir un nuevo cliente a los datos

# In[15]:


new_clients = pd.DataFrame({'first_name' : ['Rebe'],
                            'last_name' : ['MacCrossan'],
                            'age' : [21]},
                           columns = ['first_name', 'last_name', 'age'])
clients = pd.concat([clients, new_clients])
clients


# In[9]:


# Vemos que al concatenar los datos, se han mantenido los índices originales de 
# los dataframes y esto puede ser un problema más adelante.  Reseteamos el índice del dataset de clientes


# In[17]:


clients.index = range(clients.shape[0])  # shape[0] devuelve el total de filas del objeto consultado


# In[21]:


clients


# In[22]:


# Añadimos una columna con el IdCliente, de otra manera no podríamos cruzar esta tabla con la de facturas
ids = pd.DataFrame({'client_id': [1, 2, 3, 4, 5, 6]}, columns = ['client_id'])
clients = pd.concat([ids, clients], axis=1,)
clients


# ## Unión de dataframes

# In[26]:


tablon = pd.merge(clients, invoices, on ='client_id')
tablon


# In[32]:


# En el caso de que el nombre de la columna de unión de ambas tablas fuera diferente...
invoices.rename(columns = {'client_id':'id_cliente'}, inplace=True)
tablon = pd.merge(clients, invoices, left_on ='client_id', right_on ='id_cliente')
tablon


# ## Diferentes tipos de unión:  Left, Right, Inner y Outer

# In[33]:


invoices.rename(columns = {'id_cliente':'client_id'}, inplace=True)


# In[35]:


left = pd.merge(clients, invoices, on ='client_id', how ='left')
left


# In[36]:


right = pd.merge(clients, invoices, on ='client_id', how ='right')
right


# In[37]:


inner = pd.merge(clients, invoices, on ='client_id', how ='inner')
inner


# In[38]:


outer = pd.merge(clients, invoices, on ='client_id', how ='outer')
outer

