pandas


In [1]:
import pandas as pd
import numpy as np
#importar los modulos pandas y numpy con los alias convencionales

from pandas import Series, DataFrame

Series es similar a un arreglo de numpy(ndarray) con la excepción de que estos poseen un axis labels. Usaremos 's' para referinos a Series

Forma básica para crear un arreglo s = pd.Series(data, index=label)

Donde data puede ser un ndarray, dictionario, un escalar, etc.


In [2]:
#Crear una serie desde un ndarray
s = pd.Series(np.arange(0,5), index=['a', 'b', 'c', 'd', 'e'])

In [3]:
s


Out[3]:
a    0
b    1
c    2
d    3
e    4
dtype: int64

In [4]:
s.index


Out[4]:
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')

In [5]:
type(s)


Out[5]:
pandas.core.series.Series

In [6]:
s0 = Series(np.random.random(10)) #crea una serie con 10 valores aleatorios
s0


Out[6]:
0    0.101648
1    0.271679
2    0.799615
3    0.099822
4    0.828282
5    0.490294
6    0.202704
7    0.722440
8    0.458565
9    0.766434
dtype: float64

In [7]:
#Crear serie desde un dictionario
d = {'a':100,'b':124,'c':700,'d':430,'e':400}
s1 = pd.Series(d)

In [8]:
s1


Out[8]:
a    100
b    124
c    700
d    430
e    400
dtype: int64

In [9]:
#Crear serie desde un valor escalar
s2 = pd.Series(23., s1.index)

In [10]:
s2


Out[10]:
a    23.0
b    23.0
c    23.0
d    23.0
e    23.0
dtype: float64

In [11]:
# Acceder a los valores de la serie
print(s2.index) 
print(s2.values)


Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
[ 23.  23.  23.  23.  23.]

Ejercicio 1: Serie con datos del mundo real Población, total [http://datos.bancomundial.org/indicador/SP.POP.TOTL]

Crear un dos listas, una con nombre de países y la segunda con su población, con estas hacer una serie paises y poblacion,


In [12]:
lpaises=['Venezuela','República Dominicana','India','Guatemala','Alemania','Arabia Saudita','Argentina','Francia','Filipinas','Indonesia','Haití','México','Nicaragua']
lpoblacion=[31108.08,10528.39,1311050.53,16342.90,81413.15,31540.37,43416.75,66808.38,100699.40,257563.82,10711.07,127017.22,6082.03]

In [13]:
seriepp=Series(lpoblacion,lpaises)

In [14]:
seriepp['India'] #seleccionar el indice India


Out[14]:
1311050.53

In [15]:
#Ver cuales de los paises seleccionado superan los 50 millones de personas

In [16]:
seriepp[seriepp>50000]


Out[16]:
India        1311050.53
Alemania       81413.15
Francia        66808.38
Filipinas     100699.40
Indonesia     257563.82
México        127017.22
dtype: float64

In [17]:
seried = seriepp.to_dict() # convertir en un diccionario

In [18]:
seried


Out[18]:
{'Alemania': 81413.149999999994,
 'Arabia Saudita': 31540.369999999999,
 'Argentina': 43416.75,
 'Filipinas': 100699.39999999999,
 'Francia': 66808.380000000005,
 'Guatemala': 16342.9,
 'Haití': 10711.07,
 'India': 1311050.53,
 'Indonesia': 257563.82000000001,
 'México': 127017.22,
 'Nicaragua': 6082.0299999999997,
 'República Dominicana': 10528.389999999999,
 'Venezuela': 31108.080000000002}

In [19]:
seriepp.name = 'Población algunos paises'

In [20]:
seriepp['India']


Out[20]:
1311050.53

In [21]:
seriepp[['India','Aruba','Venezuela']] #Seleccionar desde una lista, en caso de no estar el elemento NaN


Out[21]:
India        1311050.53
Aruba               NaN
Venezuela      31108.08
Name: Población algunos paises, dtype: float64

In [22]:
'México' in seriepp #Verificar si México esta en la serie


Out[22]:
True

In [23]:
'Estados Unidos' in seriepp  #Verificar si Estados Unidos esta en la serie


Out[23]:
False

In [24]:
seriepp.append(Series({'Ginea':12608.59}))


Out[24]:
Venezuela                 31108.08
República Dominicana      10528.39
India                   1311050.53
Guatemala                 16342.90
Alemania                  81413.15
Arabia Saudita            31540.37
Argentina                 43416.75
Francia                   66808.38
Filipinas                100699.40
Indonesia                257563.82
Haití                     10711.07
México                   127017.22
Nicaragua                  6082.03
Ginea                     12608.59
dtype: float64

In [25]:
seriepp=seriepp.append(Series({'Ginea':12608.59})) #Agregar un elemento a una serie
seriepp


Out[25]:
Venezuela                 31108.08
República Dominicana      10528.39
India                   1311050.53
Guatemala                 16342.90
Alemania                  81413.15
Arabia Saudita            31540.37
Argentina                 43416.75
Francia                   66808.38
Filipinas                100699.40
Indonesia                257563.82
Haití                     10711.07
México                   127017.22
Nicaragua                  6082.03
Ginea                     12608.59
dtype: float64

In [ ]:


In [26]:
seriepp=seriepp.append(Series({'Otro Nación':np.NAN}))
seriepp


Out[26]:
Venezuela                 31108.08
República Dominicana      10528.39
India                   1311050.53
Guatemala                 16342.90
Alemania                  81413.15
Arabia Saudita            31540.37
Argentina                 43416.75
Francia                   66808.38
Filipinas                100699.40
Indonesia                257563.82
Haití                     10711.07
México                   127017.22
Nicaragua                  6082.03
Ginea                     12608.59
Otro Nación                    NaN
dtype: float64

In [27]:
seriepp.notnull() # retorna una serie boleana donde identifca los valores no son nulos


Out[27]:
Venezuela                True
República Dominicana     True
India                    True
Guatemala                True
Alemania                 True
Arabia Saudita           True
Argentina                True
Francia                  True
Filipinas                True
Indonesia                True
Haití                    True
México                   True
Nicaragua                True
Ginea                    True
Otro Nación             False
dtype: bool

Data Frames se define como arreglo bidimensional etiquetadas, cada columna es una Serie.


In [29]:
#Crear un DataFrame desde un dictionario

In [30]:
AntillaMayores = {'ciudad':['Santo Domingo','La Habana','San Juan','Kington','Puerto Principe'],
        'pais':['República Dominicana','Cuba','Puerto Rico','Jaimaica','Haití'],
        'poblacion':[10528.39,11389.56,3474.18,2725.94,10711.07]}

In [31]:
dfAntillasMay = DataFrame(AntillaMayores)

In [32]:
dfAntillasMay


Out[32]:
ciudad pais poblacion
0 Santo Domingo República Dominicana 10528.39
1 La Habana Cuba 11389.56
2 San Juan Puerto Rico 3474.18
3 Kington Jaimaica 2725.94
4 Puerto Principe Haití 10711.07

In [33]:
#Crear un DataFram desde multiples listas

In [34]:
#Creando varias listas con datos de paises de antillas menores territorios independient
#fuente de datos: https://es.wikipedia.org/wiki/Antillas_Menores
pais = ['Antigua y Barbuda', 'Barbados', 'Dominica', 'Granada', 'San Cristóbal y Nieve', 'San Vicente y las Granadinas', 'Santa Lucía', 'Trinidad y Tobago']
idiomaOficial = ['Inglés','Inglés','Inglés','Inglés','Inglés','Inglés','Inglés','Inglés']
superficieTerritorial = [443,431,754, 344, 261,389, 616, 5128 ] 
poblacion = [68722  , 279912 , 69278  , 89502  , 38958, 117534, 160145, 1075066]

In [35]:
etiquetas = ['pais','idioma','superficie','población']

In [36]:
listacolumnas = [pais,idiomaOficial,superficieTerritorial,poblacion]

In [37]:
datazipped = list(zip(etiquetas,listacolumnas))

In [38]:
dataantillas = dict(datazipped)

In [39]:
dfantillasmenores = DataFrame(dataantillas)
dfantillasmenores


Out[39]:
idioma pais población superficie
0 Inglés Antigua y Barbuda 68722 443
1 Inglés Barbados 279912 431
2 Inglés Dominica 69278 754
3 Inglés Granada 89502 344
4 Inglés San Cristóbal y Nieve 38958 261
5 Inglés San Vicente y las Granadinas 117534 389
6 Inglés Santa Lucía 160145 616
7 Inglés Trinidad y Tobago 1075066 5128

In [40]:
# Cambiando los nombres de las columnas
# complicarla un poco
dfantillasmenores.rename(columns={'idioma': 'Idioma Oficial','pais':'País','población':'Población','superficie':'Superficie Territorial'},inplace=True)
dfantillasmenores


Out[40]:
Idioma Oficial País Población Superficie Territorial
0 Inglés Antigua y Barbuda 68722 443
1 Inglés Barbados 279912 431
2 Inglés Dominica 69278 754
3 Inglés Granada 89502 344
4 Inglés San Cristóbal y Nieve 38958 261
5 Inglés San Vicente y las Granadinas 117534 389
6 Inglés Santa Lucía 160145 616
7 Inglés Trinidad y Tobago 1075066 5128

In [41]:
#Broadcasting o cambio en memoria, permite agregar nuevos datos o agregar columnas
#según se necesite, ejemplo una nueva colunma para asignar la visitas de turistas en el 2017

In [42]:
dfantillasmenores['Turismo 2017(MM)']=1
#De forma automática asignamos 1
dfantillasmenores


Out[42]:
Idioma Oficial País Población Superficie Territorial Turismo 2017(MM)
0 Inglés Antigua y Barbuda 68722 443 1
1 Inglés Barbados 279912 431 1
2 Inglés Dominica 69278 754 1
3 Inglés Granada 89502 344 1
4 Inglés San Cristóbal y Nieve 38958 261 1
5 Inglés San Vicente y las Granadinas 117534 389 1
6 Inglés Santa Lucía 160145 616 1
7 Inglés Trinidad y Tobago 1075066 5128 1

In [43]:
dfantillasmenores['Turismo 2017(MM)']=dfantillasmenores['Población']/dfantillasmenores['Superficie Territorial']**3

In [44]:
dfantillasmenores


Out[44]:
Idioma Oficial País Población Superficie Territorial Turismo 2017(MM)
0 Inglés Antigua y Barbuda 68722 443 0.000790
1 Inglés Barbados 279912 431 0.003496
2 Inglés Dominica 69278 754 0.000162
3 Inglés Granada 89502 344 0.002199
4 Inglés San Cristóbal y Nieve 38958 261 0.002191
5 Inglés San Vicente y las Granadinas 117534 389 0.001997
6 Inglés Santa Lucía 160145 616 0.000685
7 Inglés Trinidad y Tobago 1075066 5128 0.000008

In [ ]: