Академический Документы
Профессиональный Документы
Культура Документы
1
1. Introducción
La vez anterior habı́amos visto sobre numpy, ahora vamos a la segun-
da parte para armar la experiencia que nos va a dar las herramientas para
desarrollar nuestro trabajo dentro del Data Science que es pandas, vamos
a hablar un poco de pandas.
Las estructuras de datos mas importantes que tenemos son 2 las series y
el dataframe las series de pandas son básicamente una array de numpy en
numpy tenemos las arrays y tienen una serie reglas que también se cumplen
para las series de numpy,
2
y ya tendremos pandas instalado
3. Series
Ahora crearemos nuestra primera estructura de datos, una Serie de pan-
das, primero tenemos que importar a la librerı́a pandas, y se hace de la misma
forma que importábamos numpy, debemos escribir
import pandas as pd
Al igual que un array de numpy los datos tienen que ser homogéneos, no
puedo mezclar valores, es decir, todos los valores deben pertenecer al mismo
tipo de dato, pero una estos datos pueden ser de cualquier tipo, pueden
ser String, Int, Floats, Datetime, Boolean, Object, vamos a ver lo que
me arroja mi variable
print (a)
out:
0 1
1 2
2 3
dtype: int64
3
el tipo de dato que tiene nuestra serie, en este caso entero de 32 bits, si
inspeccionamos el tipo de dato de nuestra variable a. es el siguiente
type(a)
out:
Aquı́ podemos ver el tipo de datos mas básico que maneja pandas que son
las Series, como dijimos este objeto se comporta como una array de numpy,
entonces podemos acceder a sus datos de la misma forma que lo hacı́amos
con nuestras Arrays de numpy, por ejemplo quiero acceder al numero 2
print (a[1])
y puedo usar cualquier tipo de acceso a los datos como lo hacia con numpy,
por ejemplo, quiero accesar a todos los datos menos el primero
print (a[1:])
out:
1 2
2 3
dtype: int64
Vamos a crear otra serie de pandas, en este caso haré una serie con los
caracteres a b c y d.
a = pd. Series ([’a’,’b’,’c’,’d’])
print (a)
out:
0 a
1 b
2 c
3 d
4
dtype: object
Algo importante a notar es que nuestro tipo de dato, en este caso caracter,
pandas lo reconoce como un dato de tipo objeto, es decir, cualquier tipo
de variable string o character sera reconocida como objeto por pandas.
out:
DatetimeIndex ([’2019−01−01’, ’2019−01−02’, ’2019−01−03’, ’2019−01−04’,
’2019−01−05’, ’2019−01−06’, ’2019−01−07’, ’2019−01−08’,
’2019−01−09’, ’2019−01−10’, ’2019−01−11’, ’2019−01−12’,
’2019−01−13’, ’2019−01−14’, ’2019−01−15’],
dtype=’datetime64 [ns]’, freq=’D’)
Aqui estamos indicando hacer una Serie de tipo fecha que inice el dia 1,
de enero mes 1 del año 2019 y termine el dia 15 de enero del 2019 y si
inspeccionamos el tipo de dato de nuestra variable
type(a)
out:
Por ultimo vamos a repasar algunas utilidades de las series de pandas, em-
pecemos por el indice, en las series de pandas podemos manipular el indice,
pasandole una lista de esta manera,
5
a = pd. Series ([1 ,2 ,3])
a. index = [’a’, ’b’, ’c’]
print (a)
out:
a 1
b 2
c 3
dtype: int64
out:
a 1
b 2
dtype: int64
out:
<class ’numpy. ndarray ’>
Con esto damos por visto las series de pandas y pasamos a lo siguiente que
son, los dataframes
6
4. Dataframes
La razon de que pandas sea la herramienta mas usada para analisis
de datos, es porque dota a python de la capacidad de tener una especie
de tabla, con columnas y filas, que contienen indices y nombres para las
columnas de datos, vamos a ver como podemos crear estas estructuras
de datos, llamadas dataframes usando formas distintas, vamos a importar
nuestra libreria numpy nuevamente para crear nuestro dataframe a partir
de una array de numpy
import numpy as np
ahora vamos a crear una array de números aleatorios, con el método np.random.randint,
esto significa que creare números aleatorios enteros y le asignaremos las pro-
piedades low y high respectivamente para da un rango de generación de esos
números enteros, la propiedad size es la cantidad y forma de la array que
quiero generar
t = np. random . randint (low =10, high =100 , size =[20 ,])
esto es lo que explique arriba, pero me falto una parte y es que size recibe
como parámetro con una lista, que contiene la forma de la array que vamos
a generar, si quiero generar una array de 20 valores debo pasar una ’,’ al
final para no causar errores en la librerı́a. Ahora vamos a usar otro método
de numpy, que se llama np.random.choice que escogerá un valor de una lista
que yo le pase anteriormente
n = np. random . choice ([’Tecnologia ’, ’Micelaneos ’,
en esta linea lo que hago es pasar una lista de valores como primer parame-
tro y como segundo parametro, le paso la cantidad de valores que quiero que
ponga en ese array en este caso 20, ahora vamos a hacer nuestro dataframe.
Primeramente tenemos que hacer un zip de estos dos arrays, para que pan-
das lo reconzca como una dataframe valido, eso lo que hara es convertir
los valores de arrays a tuplas, para hacer eso debemos escribir la siguiente
linea de codigo
7
a = list(zip(t, n))
zip solo devuelve un objeto de tipo zip, entonces debemos hacer una conver-
sión explicita a lista, ahora para crear nuestro dataframe debemos hacerlo
de la siguiente forma
out:
Numero Nombre
0 63 Gagets
1 12 Ropa
2 64 Tecnologia
3 83 Micelaneos
...
type(data)
out:
<class ’pandas .core.frame. DataFrame ’>
8
y para crear nuestro dataframe le pasaremos en el parámetro datos nuestro
diccionario
data = pd. DataFrame (data=datos)
print (data)
out:
Numero categoria
0 26 Ropa
1 91 Tecnologia
2 80 Ropa
...
out:
Month " Average " "2005" "2006" "2007"
0 May 0.1 0 0 1
9
ahora veremos algunas operaciones que nos serán útiles en nuestra experien-
cia. La primera operación es head la que nos devolverá los primero 5 valores
del dataframe se usa de la siguiente manera
print (data.head ())
out:
Numero categoria
0 48 Ropa
1 46 Micelaneos
2 59 Gagets
3 92 Comida
4 13 Ropa
print (data.shape)
out:
(20, 2)
10
matriz
out:
Index ([ ’Numero ’, ’categoria ’], dtype=’object ’)
out:
0 55
1 48
2 87
3 12
4 26
5 54
6 99
...
out:
0 Ropa
1 Tecnologia
2 Micelaneos
3 Tecnologia
4 Ropa
11
print (data[’Numero ’]. describe ())
out:
count 20.000000
mean 50.300000
std 24.385285
min 13.000000
25\ % 33.750000
50\ % 51.500000
75\ % 59.250000
max 97.000000
Name: Numero , dtype: float64
Como podemos notar, todos los números son de tipo float por lo que
tienen punto decimal aunque sean enteros ahora pasare a hacer una
descripción rápida de todos estos valores
12
Otro metodo util dentro del dataframe, con el que podemos saber mas
acerca de los datos qe estamos trabando es info, veamos como se usa
print (data.info ())
out:
RangeIndex : 20 entries , 0 to 19
Data columns (total 2 columns ):
Numero 20 non−null int64
categoria 20 non−null object
dtypes : int64 (1), object (1)
memory usage: 400.0+ bytes
Al igual que la vez anterior pasare a explicar que significan estos valores
con una descripción rápida
Numero, Categoria: Estas son nuestras columnas los números nos indi-
can la cantidad de entradas que tenemos en la tabla, si hay o no valores
nulos, y el tipo de dato de cada columna
dtypes: Son los tipos de datos que hay en nuesto dataframe en este ca-
so, un tipo de dato int64 y otro object
tip
13
out:
[[50 ’Micelaneos ’]
[13 ’Micelaneos ’]
[41 ’Gagets ’]
[56 ’Micelaneos ’]
[50 ’Micelaneos ’]
[63 ’Ropa ’]
[51 ’Ropa ’]
[97 ’Tecnologia ’]
....
5. Indices
Al igual que con las series podemos manipular los indices en nuestro
dataframe y cambiar la manera acceder a los datos que tenemos en el, para
hacer esto tenemos que usar el metodo setindex de nuestro dataframe,
vamos a ver como se hace
14
data = data. set index (’Numero ’)
print (data)
out:
75 Tecnologia
81 Micelaneos
55 Ropa
11 Ropa
...
También si no queremos reasignar la variable podemos usar el parámetro
inplace que recibe un valor booleano, que cuando es true nos reasigna au-
tomáticamente la variable
data. set index (’Numero ’, inplace =True)
print (data)
out:
18 Comida
14 Tecnologia
55 Gagets
20 Tecnologia
...
Tambien podemos ordenar el indice, con el metodo sortindex de pandas
vamos a ver como se usa
\\ \\
data. sort index (axis = 0, ascending =True , inplace =True)
print (data)
out:
14 Tecnologia
18 Comida
20 Tecnologia
26 Comida
...
Recordemos que el axis = 0 significa que el cambio se hará a nivel
de las filas y axis = 1 es a nivel de las columnas aquı́ ordenamos
15
el ı́ndice de manera ascendente, pero tambien puedo ordenarlos de manera
descendente, de la siguiente forma
data. sort index (axis = 0, ascending =False , inplace =True)
print (data)
out:
95 Tecnologia
92 Gagets
84 Comida
83 Gagets
...
También puedo ordenar una columna, para eso creare un valor mas para
ponerlo en mi dataframe de la siguiente manera
r = np. random . randint (low =10, high =100 , size =[20 ,])
\\ \\
datos = { ’categoria ’:n, ’Numero ’:t, ’aleatorio ’:r}
data = pd. DataFrame (data=datos)
data. set index (’Numero ’, inplace =True)
data. sort index (axis = 0, ascending =False , inplace =True)
En este código lo que hice, fue rehacer el dataframe con otra columna
de números aleatorios, con fines de ejemplificar como podemos ordenar una
columna, y para hacerlo vamos a escribir lo siguiente
data. sort values (by = ’aleatorio ’, ascending =False , inplace =True)
out:
53 94 Ropa
66 81 Comida
72 80 Comida
...
El parámetro by recibe el nombre de nuestra columna, y en este caso quiero
que sea descendente, y como podemos observar, cuando yo ordeno los valo-
res, no solo los valores se ordenan, si no toda la tabla, incluyendo los ı́ndices,
eso es muy útil, porque no estoy desordenando mi dataframe a la hora de
analizar datos
16
Ahora si quiero descartar una columna del dataframe tengo el metodo
drop que se usa la de la siguiente manera
\\ \\
data.drop ([’aleatorio ’], axis =1, inplace =True)
print (data)
out:
53 Ropa
66 Comida
72 Comida
y ahora usaremos el primer metodo que es iloc, este método recibe como
parámetro una lista de ı́ndices o un indice, veamos
print (data.iloc [1])
out:
aleatorio 74
categoria Micelaneos
Name: 97, dtype: object
17
print (data.iloc [[0 ,1 ,2]])
out:
Numero
99 74 Gagets
97 74 Micelaneos
96 70 Ropa
aqui podemos ver la información de esos ı́ndices que mandamos a llamar con
la función iloc, pero también puedo hacer cosas mas complejas, como llamar
los elementos partiendo del primero y terminando en el cuarto de mi columna
çategoria”veamos como hacerlo
print (data.iloc [1:4 ,1])
out:
97 Micelaneos
96 Ropa
83 Gagets
Name: categoria , dtype: object
aquı́ lo que le estoy diciendo con el 1:4 es que me traiga los valores partiendo
del segundo y terminando en el cuarto, y después de la ”,” defino que sea la
segunda columna, en caso de querer la primera tendrı́a que poner 0 en vez de 1
out:
99 74 Gagets
96 70 Ropa
Esto parece raro al comienzo, pero en escénica lo que hace es recorrer los
ı́ndices empezando por el primero, y si tiene un valor True en la lista nos
devuelve el valor, de otro modo lo omite, aquı́ le estoy diciendo que me
muestre primer y tercer elemento, para comprobarlo podemos ver los
primeros valores de nuestro dataframe
print (data.head ())
18
out:
aleatorio categoria
Numero
99 74 Gagets
97 74 Micelaneos
96 70 Ropa
Ahora vamos con otro método un poco mas interesante loc, la principal
diferencia, es que iloc trabaja con un ı́ndice de 0 a el máximo valor, pero
esos valores no son nuestro ı́ndice que lo definimos cuando hicimos la tabla,
nuestro ı́ndice es aleatorio, ası́ que loc trabaja con nuestro ı́ndice ya sea
numérico o de texto, en este caso, voy a llamar a mi primer valor que tiene
el indice 99
print (data.loc [99])
out:
aleatorio 74
categoria Gagets
Name: 99, dtype: object
como vemos arrojo nuestro primer elemento, y como con iloc podemos traer
indices multiples.
print (data.loc [[97 , 99 ,76]])
out:
97 74 Micelaneos
99 74 Gagets
76 10 Micelaneos
76 74 Micelaneos
en este caso, como el indice 76 estaba repetido me trajo todos los valores
que tenı́an el indice 76. loc tiene cosas aun mas interesantes, por ejemplo
puedo buscar todos los valores que sean de la categorı́a micelaneo de esta
forma
19
print (data.loc[data[’categoria ’] == ’Micelaneos ’])
out:
aleatorio categoria
Numero
97 74 Micelaneos
76 10 Micelaneos
76 74 Micelaneos
69 23 Micelaneos
también podemos usar mas condiciones, por ejemplo quiero traer todos los
números aleatorios mayores a 70 o menores a 30
print (data.loc [( data[’aleatorio ’] > 70) | (data[’aleatorio ’] < 30)])
out:
Numero
99 74 Gagets
97 74 Micelaneos
83 10 Gagets
76 10 Micelaneos
out:
outlook temperature humidity windy play
0 overcast hot high False yes
1 overcast cool normal True yes
20
2 overcast mild high True yes
3 overcast hot normal False yes
4 rainy mild high False yes
ahora para hacer el siguiente paso debemos instalar la libreria openpyxl,
para eso escribimos en consola
ahora para guardar un archivo csv como excel tenemos que hacer lo siguiente
data. to excel (’myDataframe .xlsx ’)
ahora si vemos en nuestra carpeta tenemos un nuevo archivo excel
out:
outlook temperature humidity windy play
0 overcast hot high False yes
1 overcast cool normal True yes
2 overcast mild high True yes
3 overcast hot normal False yes
4 rainy mild high False yes
8. Utilidades de pandas
Vamos a ver algunas de las utilidades de pandas, que nos harán la vida
mas sencilla, la primera que vamos a ver es concatenacion, para eso haremos
21
dos dataframes de la siguiente manera
print (data1)
out:
letra numero
0 a 1
1 b 2
print (data2)
out:
letra numero palabra
0 a 1 Hola
1 b 2 Adios
Ahora lo que haremos es concatenar estos datos, podemos concatenar de dos
maneras, a nivel de filas axis = 0 o a nivel de columnas axis = 1, pero si
las concateno a nivel de las filas, va a pasar algo curioso, veamos
print (pd. concat ([ data1 , data2], axis =0))
out:
22
se sustituye el ı́ndice, ya que como podemos ver este, en el resultado sigue
conservando los ı́ndices de cada tabla, para evitar esto, debemos pasar un
parámetro que se llama ignore index
print (pd. concat ([ data1 , data2], axis =0, ignore index =True ))
out:
letra numero palabra
0 a 1 NaN
1 b 2 NaN
2 a 1 Hola
3 b 2 Adios
Como podemos ver ahora tenemos el ı́ndice de la tabla continuo,
del 0 al 3, también puedo concatenarlo a nivel de columnas pasando axis
=1
out:
letra numero letra numero palabra
0 a 1 a 1 Hola
1 b 2 b 2 Adios
Lo ultimo que veremos de las concatenaciones es bastante interesante, sin
mas introducción vamos a ello, vamos a definir un dataframe interesante
data1 = pd. DataFrame ({" capital ":
[’Santiago ’, ’Lima ’, ’Montevideo ’, ’Buenos air
" temperatura ":[30 ,20 ,25 ,39]})
Ahora creare otro dataframe distinto, pero guardando similaridades
data2 = pd. DataFrame ({" capital ":
[’Buenos aires ’, ’Lima ’, ’Santiago ’],
" humedad ":[68 ,61 ,63]})
Si yo quiero juntar los dos dataframes, y no sustituir los valores por comple-
to para hacer una tercera tabla de datos, porque las dos comparten valores,
peor o si no quedarı́a con datos nulos, o sustituirı́a algunos y habrı́an datos
confusos para evitar esto puedo unirlos de la siguiente manera
23
print (pd.merge(data1 , data2 , on=’capital ’))
out:
capital temperatura humedad
0 Santiago 30 63
1 Lima 20 61
2 Buenos aires 39 68
como podemos ver, los valores se combinaron y los que arrojaban nulo, se
borraron directamente, y como evito esto, esto se evita de la siguiente forma.
print (pd.merge(data1 , data2 , on=’capital ’, how=’outer ’))
out:
capital temperatura humedad
0 Santiago 30 63.0
1 Lima 20 61.0
2 Montevideo 25 NaN
3 Buenos aires 39 68.0
Aquı́ podemos ver que unimos las dos tablas conservando los valores nulos y
la temperatura de montevideo.
out:
106.16062176165804
pero lo interesante de groupby es que puedo sacar la media de cervezas ser-
vidas por cada continente de esta manera
24
print (data. groupby (’continent ’). mean ())
out:
continent
Africa 61.471698
Asia 37.045455
Europe 193.777778
North America 145.434783
Oceania 89.687500
South America 175.083333
Name: beer servings , dtype: float64
out:
Africa 376
Asia 247
Europe 361
North America 285
Oceania 306
South America 333
out:
continent
Africa 0
Asia 0
Europe 0
North America 1
Oceania 0
South America 93
25
print (data. groupby (’continent ’). beer servings .agg ([ ’mean ’, ’min ’, ’max
out:
mean min max
continent
Africa 61.471698 0 376
Asia 37.045455 0 247
Europe 193.777778 0 361
North America 145.434783 1 285
Oceania 89.687500 0 306
South America 175.083333 93 333
y con esto pasamos al ultimo tema que quiero cubrir en esta entrega de
pandas, ya que en el futuro habrán mas entregas, pero por ahora esto es lo
necesario a saber para avanzar en los tutórales de un futuro
9. Tablas Pivotes
Las tablas pivote son un concepto muy bueno de pandas, que nos permiten
generar tablas a partir de una función y agruparlas, similar a groupby pero
nos devuelven la información a una tabla se usan de la siguiente manera
pivot = data. pivot table (
values = ’ total litres of pure alcohol ’,
index=’continent ’,
aggfunc =’mean ’)
Aqui estoy indicando a pandas que quiero tomar la columna litros de al-
cohol puro en total y quiero que los agrupe por el indice continente, que
en este caso es nuestro ’Groupby’ y que aplique la funcion media a los
valores
26
print (pivot)
out:
total litres of pure alcohol
continent
Africa 3.007547
Asia 2.170455
Europe 8.617778
North America 5.995652
Oceania 3.381250
South America 6.308333
10. Conclusión
Pandas es una librerı́a muy poderosa, por eso es tan utilizada en análisis
de datos, porque además de ser fácil de usar, se puede hacer un análisis
completo en muy pocas lineas de código, algo que no todas las librerı́as
pueden, además es muy eficiente a la hora de ahorrar espacio en memoria,
y muy rápida en todas sus operaciones, espero hayas aprendido a usar esta
librerı́a en un 50 por ciento, aun falta mas, pero quiero ver algo antes de
seguir con esta librerı́a
11. Agradecimientos
Como siempre, gracias a todos los grupos de facebook que me dejan pu-
blicar en sus paginas y me dan la visibilidad que anhelo para seguir en el
mundo de la investigación, como siempre si te gusto, comparte esta publica-
ción con tus amigos, y si quieres apoyarme te dejo un link de donación en
paypal, aunque no es necesario, con tu feedback de doy por pagado, muchas
gracias y hasta la próxima
Donaciones aquı́, para mis tazas de café
27