Curso de introducción a la programación con Python¶

    Autor: Luis Fernando Apáez Álvarez
    -Curso PyM-
    Clase 6: Uniones (parte I)
    Fecha: 11 de diciembre del 2022


Contenido¶

  • Diagramas de Venn
    • Conjuntos matemáticos
    • Operaciones entre conjuntos
  • Uniones
    • Uniones internas

En esta clase veremos cómo realizar distintas uniones entre dataframes, pero antes de ello indagaremos un poco en diagramas de Venn para entender de manera visual lo que ocurre detrás de esas uniones.

Diagramas de Venn ¶

Un diagrama de Venn es una representación que sirve para visualizar conjuntos y operaciones entre ellos.

Conjuntos matemáticos¶

A los conjuntos matemáticos se les suele denotar por llaves, por ejemplo podemos considerar el conjunto matemático $A=\{1,2,3\}$ o $B=\{3,4,5\}$. Cabe mencionar que dentro de un conjunto matemático no se admiten elementos repetidos, es decir, los siguientes conjuntos son iguales:

$$ \{1,2,3,3,3,2,1\} =\{1,2,3\} $$

Además, dentro de un conjunto no hay un orden como tal, es decir, si consideramos de nuevo el conjunto $A=\{1,2,3\}$, no podemos decir que el $1$ sea el primer elemento del conjunto $A$ o que el $3$ es el tercer elemento del conjunto $A$. Por ende, también podemos decir que los siguientes conjuntos son iguales:

$$ \{3,2,1\} =\{1,2,3\}=\{2,1,3\}=\{2,3,1\} $$

La idea de conjunto matemático es análoga a la de conjunto, o set, dentro de Python. Recordemos que podemos definir un set como:

In [12]:
# podemos definir dos sets en python
A = {1,2,3}
B = {3,4,5}

print(A)
print(type(B))
{1, 2, 3}
<class 'set'>
In [13]:
# vemos que no puede haber elementos repetidos
print({1,2,3,3,2,1})
{1, 2, 3}

Operaciones entre conjuntos¶

Consideremos los conjuntos

$$ A=\{a,b,c,1,2\}, \ \ \ \ \ B=\{c,d,e,2,3\} $$

Tendremos que la operación de unión ($\cup$) entre dos conjuntos consiste en juntar todos los elementos de los conjuntos involucrados en un solo conjunto. Por ejemplo:

$$ A\cup B=\{a,b,c,1,2,c,d,e,2,3\}=\{a,b,c,d,e,1,2,3\} $$

Así, a lo hecho anteriormente podremos representarlo visualmente mediante diagramas de Venn. Antes de hacerlo veamos como graficar con Python diagramas de Venn. Para ello

In [3]:
# importaciones necesarias
import matplotlib.pyplot as plt
# Antes de realizar esta importacion seria necesario
# instalar primero la libreria:
# !pip install matplotlib_venn 
from matplotlib_venn import venn2 

Ahora bien, con la función venn2 podemos graficar dos círculos que representan dos conjuntos:

In [17]:
# Graficamos dos conjuntos, donde cada
# circulo representa un conjunto
venn2((1,1,1))
plt.show()

donde vemos que se les ha asignado una etiqueta (A y B) por default a cada conjunto, además la tupla (1,1,1) representa la proporción entre las tres partes diagrama anterior. Por ejemplo, podemos hacer que el conjunto B sea el doble que el A:

In [18]:
venn2((1,2,1))
plt.show()
In [19]:
# o podemos hacer que el conjunto A sea el doble que
# el B
venn2((2,1,1))
plt.show()
In [20]:
# o podemos hacer que la parte de enmedio sea el doble
# que el resto
venn2((1,1,2))
plt.show()

Podemos cambiar los colores de los conjuntos A y B:

In [21]:
# cambiamos los colores de los conjuntos con
# set_colors()
#                             A      B
venn2((1,1,1), set_colors=('blue', 'red'))
plt.show()

O podemos cambiar la etiqueta que se muestra de cada conjunto. Por ejemplo, cambiemos las etiquetas A y B por X y Y:

In [31]:
# Cambiamos las etiquetas
venn2((1,1,1), 
      #            A    B
      set_labels=('X', 'Y'),
      # Cambiamos los colores
      set_colors=('yellow', 'purple'),
      # con alpha= configuramos el 
      # nivel de transparencia
      alpha=0.2)
plt.show()
In [28]:
# Probamos con un alpha mas grande
venn2((1,1,1), 
      #            A    B
      set_labels=('X', 'Y'),
      # Cambiamos los colores
      set_colors=('yellow', 'purple'),
      # con alpha= configuramos el 
      # nivel de transparencia
      alpha=0.8)
plt.show()

Ahora bien, del diagrama anterior podemos considerar 3 partes:

  • La parte de la izquierda (Amarillo): tiene asociado un id o identificador igual a 10.
  • La parte de enmedio (amarillo/morado): tiene asociado un id o identificador igual a 11.
  • La parte de la derecha (Morado): tiene asociado un id o identificador igual a 01.

Así, podemos acceder a cada una de las partes anteriores con la función get_label_by_id() y colocar etiquetas visibles, así como los unos que vemos en el diagrama anterior. Por ejemplo:

In [29]:
# definimos un diagrama de venn
venn1 = venn2((1,1,1))

# accedemos a la parte de la izquierda y 
# colocamos un texto con la funcion set_text()
# como sigue
venn1.get_label_by_id('10').set_text('Left')
In [33]:
# definimos un diagrama de venn
venn1 = venn2((1,1,1))

# colocamos ahora un texto en el centro y a la
# derecha
venn1.get_label_by_id('11').set_text('Center')
venn1.get_label_by_id('01').set_text('Right')

Podemos adicionalmente cambiar el color del texto colocado, por ejemplo, podemos cambiar el color de la palabra center:

In [35]:
# definimos un diagrama de venn
venn1 = venn2((1,1,1))

# colocamos un texto en el centro y cambiamos
# su color
venn1.get_label_by_id('11').set_text('Center')
venn1.get_label_by_id('11').set_color('blue')

Asimismo, con la función get_patch_by_id() podemos acceder directamente a cada una de las partes del diagrama anterior. Por ejemplo, podemos cambiar el color de la parte de enmedio:

In [36]:
# definimos un diagrama de venn
venn1 = venn2((1,1,1))

# colocamos el color de la parte de enmedio
venn1.get_patch_by_id('11').set_color('blue')

Ahora bien, recordemos que consideramos la unión de conjuntos

$$ A\cup B=\{a,b,c,1,2,c,d,e,2,3\}=\{a,b,c,d,e,1,2,3\} $$

y lo que queremos ahora es representar dicha unión de manera gráfica, para ello:

In [47]:
# definimos un diagrama de venn
venn1 = venn2((1,1,1))

# configuramos un mismo color para las tres partes
venn1.get_patch_by_id('10').set_color('blue')
venn1.get_patch_by_id('11').set_color('blue')
venn1.get_patch_by_id('01').set_color('blue')

# Para quitar los unos que se ven por defecto
# colocamos como etiquetas cadenas vacias
venn1.get_label_by_id('10').set_text('')
venn1.get_label_by_id('11').set_text('')
venn1.get_label_by_id('01').set_text('')

plt.title('Representación de $A\cup B$')
plt.show()

Tenemos enconces que al considerar los conjuntos A y B como dos círculos, la unión de dichos conjuntos está representado como toda la parte sombreada del diagrama anterior, es decir, la unión de los conjuntos constan de la unión de los dos círculos.

Otra manera de representación podría ser:

In [53]:
# definimos un diagrama de venn
venn1 = venn2((1,1,1),
             #                    A                     B   
             set_labels=('$A=\{a,b,c,1,2\}$', '$B=\{c,d,e,2,3\}$'))

# configuramos un mismo color para las tres partes
venn1.get_patch_by_id('10').set_color('blue')
venn1.get_patch_by_id('11').set_color('blue')
venn1.get_patch_by_id('01').set_color('blue')

# Para quitar los unos que se ven por defecto
# colocamos como etiquetas cadenas vacias
venn1.get_label_by_id('10').set_text('a, b, 1')
venn1.get_label_by_id('11').set_text('c, 2')
venn1.get_label_by_id('01').set_text('d, e, 3')

plt.title('$A\cup B=\{a,b,c,d,e,1,2,3\}$')
plt.show()

Lo cual nos brinda mayor información. Notemos que en el diagrama hemos colocado los elementos de al siguiente manera:

  • id = 10 (parte de la izquierda): colocamos los elementos a,b,1 pues dichos elementos únicamente están en el conjunto A y no en el conjunto B
In [54]:
# definimos un diagrama de venn
venn1 = venn2((1,1,1),
             #                    A                     B   
             set_labels=('$A=\{a,b,c,1,2\}$', '$B=\{c,d,e,2,3\}$'))

# configuramos un mismo color para las tres partes
venn1.get_patch_by_id('10').set_color('red')
venn1.get_patch_by_id('11').set_color('blue')
venn1.get_patch_by_id('01').set_color('blue')

# Para quitar los unos que se ven por defecto
# colocamos como etiquetas cadenas vacias
venn1.get_label_by_id('10').set_text('a, b, 1')
venn1.get_label_by_id('11').set_text('c, 2')
venn1.get_label_by_id('01').set_text('d, e, 3')

plt.title('$A\cup B=\{a,b,c,d,e,1,2,3\}$')
plt.show()

donde $A=\{$ a,b $,c, $ 1, $2\}$, luego, los elementos c y 2 son elementos también del conjunto A, pero dichos elementos están además en el conjunto B, es decir, los elementos c y 2 son elementos de los conjuntos A y B de manera simultánea, por ende dichos elementos son colocados en la parte de enmedio

  • id = 11 (parte central): colocamos los elementos c y 2 dado que éstos se encuentran en los conjuntos A y B de manera simultánea
In [67]:
# definimos un diagrama de venn
venn1 = venn2((1,1,1),
             #                    A                     B   
             set_labels=('$A=\{a,b,c,1,2\}$', '$B=\{c,d,e,2,3\}$'))

# configuramos un mismo color para las tres partes
venn1.get_patch_by_id('10').set_color('blue')
venn1.get_patch_by_id('11').set_color('red')
venn1.get_patch_by_id('01').set_color('blue')

# Para quitar los unos que se ven por defecto
# colocamos como etiquetas cadenas vacias
venn1.get_label_by_id('10').set_text('a, b, 1')
venn1.get_label_by_id('11').set_text('c, 2')
venn1.get_label_by_id('01').set_text('d, e, 3')

plt.title('$A\cup B=\{a,b,c,d,e,1,2,3\}$')
plt.show()
  • id = 01 (parte de la derecha): finalmente colocamos los elementos d,e y 3 a la derecha puesto que dichos elementos únicamente están en el conjunto B.
In [68]:
# definimos un diagrama de venn
venn1 = venn2((1,1,1),
             #                    A                     B   
             set_labels=('$A=\{a,b,c,1,2\}$', '$B=\{c,d,e,2,3\}$'))

# configuramos un mismo color para las tres partes
venn1.get_patch_by_id('10').set_color('blue')
venn1.get_patch_by_id('11').set_color('blue')
venn1.get_patch_by_id('01').set_color('red')

# Para quitar los unos que se ven por defecto
# colocamos como etiquetas cadenas vacias
venn1.get_label_by_id('10').set_text('a, b, 1')
venn1.get_label_by_id('11').set_text('c, 2')
venn1.get_label_by_id('01').set_text('d, e, 3')

plt.title('$A\cup B=\{a,b,c,d,e,1,2,3\}$')
plt.show()

En resumen podemos decir que:

In [69]:
# definimos un diagrama de venn
venn1 = venn2((1,1,1),
             #                    A                     B   
             set_labels=('$A=\{a,b,c,1,2\}$', '$B=\{c,d,e,2,3\}$'))

# configuramos un mismo color para las tres partes
venn1.get_patch_by_id('10').set_color('red')
venn1.get_patch_by_id('11').set_color('red')
venn1.get_patch_by_id('01').set_color('blue')

# Para quitar los unos que se ven por defecto
# colocamos como etiquetas cadenas vacias
venn1.get_label_by_id('10').set_text('')
venn1.get_label_by_id('11').set_text('')
venn1.get_label_by_id('01').set_text('')

plt.title('En rojo representamos al\n conjunto $A$')
plt.show()
In [70]:
# definimos un diagrama de venn
venn1 = venn2((1,1,1),
             #                    A                     B   
             set_labels=('$A=\{a,b,c,1,2\}$', '$B=\{c,d,e,2,3\}$'))

# configuramos un mismo color para las tres partes
venn1.get_patch_by_id('10').set_color('blue')
venn1.get_patch_by_id('11').set_color('red')
venn1.get_patch_by_id('01').set_color('red')

# Para quitar los unos que se ven por defecto
# colocamos como etiquetas cadenas vacias
venn1.get_label_by_id('10').set_text('')
venn1.get_label_by_id('11').set_text('')
venn1.get_label_by_id('01').set_text('')

plt.title('En rojo representamos al\n conjunto $B$')
plt.show()

y finalmente:

In [65]:
# definimos un diagrama de venn
venn1 = venn2((1,1,1),
             #                    A                     B   
             set_labels=('$A=\{a,b,c,1,2\}$', '$B=\{c,d,e,2,3\}$'))

# configuramos un mismo color para las tres partes
venn1.get_patch_by_id('10').set_color('red')
venn1.get_patch_by_id('11').set_color('yellow')
venn1.get_patch_by_id('01').set_color('blue')

# Para quitar los unos que se ven por defecto
# colocamos como etiquetas cadenas vacias
venn1.get_label_by_id('10').set_text('Solo elementos\n del conjunto\n $A$')
venn1.get_label_by_id('11').set_text('\n\nElementos \ncompartidos')
venn1.get_label_by_id('01').set_text('Solo elementos\n del conjunto\n $B$')

plt.title('$A\cup B=\{a,b,c,d,e,1,2,3\}$')
plt.show()

La parte de enmedio del diagrama anterior corresponde a la intersección ($\cap$) entre los conjuntos A y B, es decir, $A\cap B$ son los elementos que están de manera simultánea en el conjunto A y en el B. De tal manera $A\cap B=\{c,2\}$.

Luego, podemos realizar varios diagramas de Venn en una misma figura

In [121]:
# La siguiente linea de codigo sera explicada en clases posteriores:
fig, (ax0, ax1) = plt.subplots(nrows=1, ncols=2, figsize=(12,6))

# diagrama 1
# pasamos al parametro ax= el valor de ax0 que hace referencia al primer
# grafico
v1 = venn2((1,1,1), set_labels=('$A_{1}$', '$B_{1}$'), alpha=0.6, ax=ax0)
# diagrama 2
# pasamos al parametro ax= el valor de ax1 que hace referencia al segundo
# grafico
v2 = venn2((1,1,1), set_labels=('$A_{2}$', '$B_{2}$'), alpha=0.6, ax=ax1)

# Colores diagrama 1
v1.get_patch_by_id('10').set_color('#6B73C2')
v1.get_patch_by_id('11').set_color('#002AB4')
v1.get_patch_by_id('01').set_color('#051AFB')

# Colores diagrama 2
v2.get_patch_by_id('10').set_color('#A3A09F')
v2.get_patch_by_id('11').set_color('#696868')
v2.get_patch_by_id('01').set_color('#000000')

# Titulos:
# diagrama 1
ax0.set(title='Diagrama 1')
# diagrama 2
ax1.set(title='Diagrama 2')

plt.show()

donde además, de nrows=1, ncols=2, figsize=(12,6) tenemos que la figura global abarcará una fila de gráficos y dos columnas, es decir, en una misma línea del gráfico podremos colocar dos subgráficos. Luego, figsize nos permite especificar el largo (12) y el ancho (6) de la figura global o general.

Existen otro tipo de operaciones entre conjuntos, los cuales omitiremos. Por otro lado, podemos realizar la unión e intersección entre sets de Python. Recordemos que tenemos definidos dos sets:

In [72]:
print(A)
print(B)
{1, 2, 3}
{3, 4, 5}

Luego, sabemos que $A\cup B=\{1,2,3,4,5\}$. Podemos obtener la unión entre dos sets con el método union() aplicado como sigue:

In [74]:
# representamos A union B
A.union(B)
Out[74]:
{1, 2, 3, 4, 5}

Sabemos que la intersección es $A\cap B=\{3\}$:

In [75]:
# representamos A interseccion B
A.intersection(B)
Out[75]:
{3}

Uniones ¶

En esta sección veremos las distintas maneras de unir dataframes, lo cual puede ser muy útil en distintos contextos, por ejemplo, puede ser que la información con la cual estamos trabajando se encuentra dividida en varias tablas o dataframes, por lo cual será necesario unir dos o más tablas para nuestro análisis.

Para ello construiremos los siguientes dataframes:

  • Un dataframe con la información básica de los empleados de una compañia:
In [93]:
# Utilizaremos la libreria pandas y faker
import pandas as pd
import numpy as np
from faker import Faker

# Instanciamos
fake = Faker()

# Creamos valores para asignar ids
ID = [i for i in range(1, 1001)]
# creamos 1000 nombres 
nombres = [fake.name() + ' ' + fake.last_name() for i in range(1000)]
# 1000 correos electronicos
correos = [fake.email() for i in range(1000)]
# 1000 edades
edades = [fake.random_int(18, 80) for i in range(1000)]

# Creamos un diccionario con la info anterior
dict_info = {'ID': ID, 'Nombre': nombres, 'Edad': edades, 'Correo': correos}
# Creamos el dataframe
df_empleados = pd.DataFrame(dict_info)
df_empleados.head()
Out[93]:
ID Nombre Edad Correo
0 1 Mark Good Ortiz 72 ronnie80@example.com
1 2 Sabrina Coleman DVM Reed 41 deckerkimberly@example.org
2 3 Courtney Romero Lewis 48 robert40@example.net
3 4 Pamela Owens Zamora 20 bishopdarlene@example.org
4 5 Allison Garrett Davis 52 dunlapmaria@example.org

donde cada empleado tiene asignado un único ID, es decir, podemos identificar perfectamente a cada empleado con su ID asignado.

  • Un dataframe con el salario de los empleados anteriores
In [82]:
# 1000 salarios
salarios = [np.random.rand() * 10000 for i in range(1000)]

# Creamos un diccionario con el salario y el ID
dict_info = {'ID': ID, 'Salario': salarios}

# Creamos el dataframe
df_salario = pd.DataFrame(dict_info)
df_salario.head()
Out[82]:
ID Salario
0 1 1911.779807
1 2 1884.304140
2 3 3923.263730
3 4 6673.917776
4 5 9902.819926

Cabe mencionar que para poder unir dos dataframes es necesario que éstos estén relacionados, al menos, por una columna. Es por ello que hemos definidos los dos dataframes anteriores y hemos colocado en ambos la misma columna ID. Luego, para fines ilustrativos, supongamos que han ingresado a la compañia dos nuevos empleados

In [94]:
# Libreria para no ver las advertencias en la salida
import warnings
warnings.filterwarnings('ignore')

# Empleados nuevos
emp1 = {'ID': 1001, 'Nombre': 'Diana Smith', 'Edad': 27, 'Correo': 'diana27182@edu.com'}
emp2 = {'ID': 1002, 'Nombre': 'Luka Ldresh', 'Edad': 20, 'Correo': 'lukaecdf@gmail.com'}

# Los agregamos al dataframe
df_empleados = df_empleados.append(emp1, ignore_index=True)
df_empleados = df_empleados.append(emp2, ignore_index=True)

df_empleados.tail()
Out[94]:
ID Nombre Edad Correo
997 998 Amber Anderson Roberts 54 whuerta@example.org
998 999 Diane Daniels King 39 ncalderon@example.com
999 1000 Corey Taylor Turner 53 fowlerrichard@example.org
1000 1001 Diana Smith 27 diana27182@edu.com
1001 1002 Luka Ldresh 20 lukaecdf@gmail.com

Pero aún no se ha actualizado la información de sus salarios en el dataframe df_salarios, de donde el dataframe df_empleados tiene dos elementos más que df_salarios.

Uniones internas¶

Podemos considerar a los dataframes que definimos antes como dos conjuntos. De tal manera, la intersección entre esos dos conjuntos (dataframes) se conoce como unión interna, o inner join. Gráficamente:

In [125]:
# ahora configuramos 3 subgraficos
fig, (ax0, ax1, ax2) = plt.subplots(nrows=1, ncols=3, figsize=(14,6))

# diagrama 1
v1 = venn2((1,1,1), set_labels=('', ''), alpha=0.6, ax=ax0)
# diagrama 2
v2 = venn2((1,1,1), set_labels=('', ''), alpha=0.6, ax=ax1)
# diagrama 3
v3 = venn2((1,1,1), set_labels=('', ''), alpha=0.6, ax=ax2)

# Colores diagrama 1
v1.get_patch_by_id('10').set_color('red')
v1.get_patch_by_id('11').set_color('red')
v1.get_patch_by_id('01').set_color('#FF7F05')

# Colores diagrama 2
v2.get_patch_by_id('10').set_color('#FF7F05')
v2.get_patch_by_id('11').set_color('red')
v2.get_patch_by_id('01').set_color('red')

# Colores diagrama 2
v3.get_patch_by_id('10').set_color('#FF7F05')
v3.get_patch_by_id('11').set_color('red')
v3.get_patch_by_id('01').set_color('#FF7F05')

# quitamos las etiquetas:
v1.get_label_by_id('10').set_text('')
v1.get_label_by_id('11').set_text('')
v1.get_label_by_id('01').set_text('')
v2.get_label_by_id('10').set_text('')
v2.get_label_by_id('11').set_text('')
v2.get_label_by_id('01').set_text('')
v3.get_label_by_id('10').set_text('')
v3.get_label_by_id('11').set_text('')
v3.get_label_by_id('01').set_text('')

# Titulos:
# diagrama 1
ax0.set(title='En rojo: df_empleados')
# diagrama 2
ax1.set(title='En rojo: df_salarios')
# diagrama 2
ax2.set(title='En rojo: unión interna')

plt.show()
In [132]:
# mas concisamente

# tamanio (largo por ancho) del grafico
plt.figure(figsize=(8,6))

# diagrama
v = venn2((1,1,1), set_labels=('df_empleados', 'df_salarios'), alpha=0.8)

# Colores
v.get_patch_by_id('10').set_color('#DCDCDC')
v.get_patch_by_id('11').set_color('#696868')
v.get_patch_by_id('01').set_color('#000000')
# Etiquetas
v.get_label_by_id('10').set_text('')
v.get_label_by_id('11').set_text('Intersección\no\nUnión interna')
v.get_label_by_id('01').set_text('')

plt.title('Unión interna', size=18)
plt.show()

Recordemos que para realizar una unióno intersección entre dos sets de python escribíamos, por ejemplo, A.union(B) o A.intersection(B). Luego, podemos realizar una unión interna entre dos dataframes con la función merge() de la forma:


dataframe1.merge(dataframe2, on=)

donde colocaremos en on= el nombre de la columna que relaciona a dichos dataframes. Para nuestro ejemplo tenemos:

In [135]:
# realizamos la union interna
df_union_interna = df_empleados.merge(df_salario, on='ID')

# veamos
df_union_interna.head()
Out[135]:
ID Nombre Edad Correo Salario
0 1 Mark Good Ortiz 72 ronnie80@example.com 1911.779807
1 2 Sabrina Coleman DVM Reed 41 deckerkimberly@example.org 1884.304140
2 3 Courtney Romero Lewis 48 robert40@example.net 3923.263730
3 4 Pamela Owens Zamora 20 bishopdarlene@example.org 6673.917776
4 5 Allison Garrett Davis 52 dunlapmaria@example.org 9902.819926

conseguimos con lo anterior tener en un mismo dataframe la información básica de los empleados junto con su salario. Nota que no se colocaron dos columna ID pues, dado que en ambos dataframes tenemos dicha columna, bastará con colocar una sola.

Recordemos que en df_empleados tenemos dos empleados cuyo ID no aparece en el dataframe df_salario

In [137]:
display(df_empleados.tail(2))
display(df_salario.tail(2))
ID Nombre Edad Correo
1000 1001 Diana Smith 27 diana27182@edu.com
1001 1002 Luka Ldresh 20 lukaecdf@gmail.com
ID Salario
998 999 5733.948481
999 1000 2278.080933
In [138]:
# o podemos ver si hay algun ID en el dataframe df_salario
# que sea igual a 1001 o 1002

df_salario[df_salario['ID'].isin([1001, 1002])]
Out[138]:
ID Salario

Así, dado que la unión interna no es más que la intersección entre los dataframes (vistos como conjuntos), entonces los dos empleados nuevos que agregamos al dataframe df_empleados no son contemplados en el dataframe resultante de la unión interna. En efecto:

In [139]:
df_union_interna[df_union_interna['ID'].isin([1001, 1002])]
Out[139]:
ID Nombre Edad Correo Salario
In [140]:
df_union_interna.tail()
Out[140]:
ID Nombre Edad Correo Salario
995 996 Stephanie Ortega Garcia 25 salazarchase@example.org 5194.657376
996 997 Sara Baker Foster 19 ewhite@example.net 9925.582227
997 998 Amber Anderson Roberts 54 whuerta@example.org 6042.569715
998 999 Diane Daniels King 39 ncalderon@example.com 5733.948481
999 1000 Corey Taylor Turner 53 fowlerrichard@example.org 2278.080933
In [141]:
df_union_interna.ID.max()
Out[141]:
1000

Gráficamente podría verse como:

In [151]:
# mas concisamente

# tamanio (largo por ancho) del grafico
plt.figure(figsize=(8,6))

# diagrama
v = venn2((1,1,1), set_labels=('df_empleados', 'df_salarios'), alpha=0.8)

# Colores
v.get_patch_by_id('10').set_color('#DCDCDC')
v.get_patch_by_id('11').set_color('#FF0202')
v.get_patch_by_id('01').set_color('#797979')
# Etiquetas
v.get_label_by_id('10').set_text("ID's:\n 1001 y 1002")
v.get_label_by_id('11').set_text("ID's:\n del 1 al 1000")
v.get_label_by_id('01').set_text("No hay ID's que estén\nexclusivamente\n en df_salarios")

plt.title('Unión interna', size=18)
plt.show()