Las estructuras de datos nos dicen como organizar y almacenar los datos que usamos. Tales estructuras van de lo simple a lo compuesto, y se les usa segun la necesidad particular. Veamos 4 de estas:
Las Listas y tuplas son estructuras simples; un Data frame (DF) es una compuesta. Los dictionarios (tcc dicts) son estructuras versatiles a pesar de su simplicidad. Los DFs necesitan la instalación de librerías adicionales (no están en la base del Python).
Las listas contienen valores de cualquier tipo simple (numérico o no numérico), y podrían ser estructuras compuestas (lista de listas). Si usamos como referencia a una hoja de calculo con datos sobre individuos, una lista podria ser una fila que tiene los datos de los individuos.
DetailStudent=["Fred Meyers",40,"False"]
El object ‘DetailStudent’ almacena temporalmente la lista en la computadora. Los nombre pueden contener letras del alfabeto y números (y algunos caracteres de puntuación), pero no debe comenzar con un número.
En el código anterior, sólo se ha pedido crear la lista. Python lo ejecuta y nada más, no tienes que esperar ningún mensaje ni resultado. Si quieres ver lo que has creado, escribelo de manera explicita, así:
DetailStudent
Nota que hay varios tipos de datos en la lista:
Para acceder a cada uno de los elemento tu lista:
DetailStudent[0] # primer elemento comienza con indice '0'
DetailStudent[:2] # todo antes de índice 2
DetailStudent[-1] # ultimo elementos
Si quieres cambiar algun valor:
DetailStudent[0]='Alfred Mayer'
DetailStudent
Para añadir elementos:
DetailStudent.append('Seattle')
# Ahora tienes:
DetailStudent
Para borrar, se puede hacer por...
Así, ante estas listas:
elementsA=[1,2,3,4]
elementsB=[1,2,3,4]
Then:
## borrar tercer elemento
del elementsA[2]
# luego:
elementsA #
# borrar valor '2'
elementsB.remove(2)
elementsB
Si lo que querias era dejarlo vacío
DetailStudent[3]=None
DetailStudent
Para eliminar la lista:
newList=['a','b']
del newList
newList # becareful!... it is gone!
A veces queremos eliminar valores repetidos:
weekdays=['M','T','W','Th','S','Su','Su']
weekdays
Para ello tenemos la función set:
weekdays=list(set(weekdays))
weekdays
Los vectores no son parte del modulo básico de Python, por lo que necesitan que llames a numpy (instálalo antes):
import numpy as np
vector=np.array([1,'2',3])
vector # aquí hay coerción pues solo debe haber un tipo de datos
Los nombres de los vectores siguen las mismas reglas que para las listas.
Acceder a los elementos es igual que en listas:
vector[1]
vector[1]=1.5
vector
Por lo anterior, nótese que ya que el vector es de textos, se coercionará a texto cada valor numérico ingresado.
Para añadir elementos, también se usa append, pero algo diferente:
vectora=np.array([1,2,3])
vectorb=np.array([1,2,'3'])
vectora=np.append(vectora,vectorb)
vectora
Para eliminar elementos:
vectorc = np.array(['a','b','c','d'])
index = [1,2]
vectorc = np.delete(vectorc, index)
vectorc
También hay manera de eliminar valores duplicados:
np.unique([1, 1, 22, 22, 333, 33])
Al principio parace que fueran listas:
DetailStudentaTuple=("Fred Meyers",40,"False")
Para crearlas puedes usar '( )', el comando tuple() o nada:
DetailStudentbTuple='Michael Nelson',60,'True'
La gran diferencia es que una vez creadas, ninguno de sus valores se puede modificar:
# genera error
DetailStudentbTuple[1]=50
Los Dicts, superficialmente, son lo más similares a las listas de R:
# creating dict:
DetailStudentDict={'fullName':"Fred Meyers",
'age':40,
'female':False}
# seeing it:
DetailStudentDict
Pero no tienen índices:
DetailStudentDict[0]
Pare ver un elemento, tienes que saber el nombre de su campo ('key'):
DetailStudentDict['age']
A partor de ahi, puedes hacer las operaciones comunes:
DetailStudentDict['age']=81
DetailStudentDict
A) Aseguráte de saber qué tienes:
type(DetailStudentDict)
type(DetailStudent)
type(DetailStudentaTuple)
B) Asegúrate que las funciones se pueden compartir
listTest=[1,2,3,3]
tupleTest=(1,2,3,4,4)
dictTest={'a':1,'b':2,'c':2}
len(listTest), len(tupleTest), len(dictTest)
Los Data frames pueden interpretarse como estructuras compuestas en base a las simples. Python requiere que llamemos al pandas para usar DFs:
# instálalo antes!
!pip install pandas
Ahora sí llamamos a Pandas:
import pandas
# estas son columnas:
names=["Qing", "Françoise", "Raúl", "Bjork"]
ages=[32,33,28,30]
country=["China", "Senegal", "Spain", "Norway"]
education=["Bach", "Bach", "Master", "PhD"]
# las llevamos a dict:
data={'names':names, 'ages':ages, 'country':country, 'education':education}
...y de dict a DF:
students=pandas.DataFrame.from_dict(data)
# check it:
students
También podría ser a partir de filas:
# Listas por fila
row1=["Qing", 32,"China", "Bach"]
row2=["Françoise", 33, "Senegal", "Bach"]
row3=["Raúl", 28, "Spain", "Master"]
row4=["Bjork", 30, "Norway", "PhD"]
#Lista de listas de filas
listOfRows=[row1,row2,row3,row4]
#creandolo:
DF_lists=pandas.DataFrame(listOfRows,columns=['names','ages','country','education'])
DF_lists
Tendremos un data frame? Recuerda que type te lo dice:
type(students)
Pero Pandas da más detalles son 'dtypes':
students.dtypes
Además de dtypes(), es bueno saber que puedes usar:
# cuantas filas y columnas tienes:
students.shape #
No hay función específica para saber cuantas filas o columnas hay independientemente, pero len ayuda:
len(students.index) # or students.shape[0]
len(students.columns) # or students.shape[1]
También son muy útiles las función head(), que te permite ver las filas al inicio del DF:
students.head(2)
Y su antónimo también está disponible:
students.tail(2)
Claro que es bueno saber qué variables tenemos:
students.columns
Lo anterior no es una lista, pero si la necesitas:
list(students)
Tu DF es la tabla de datos a la que estás acostumbrado a utilizar. Si quieres ver algun elemento en particular:
# una columna
students.names
# or
students['names']
# # varias columnas (con posiciones)
students.iloc[:,[1,3]]
# varias columnas (con nombres)
students[['country','education']]
# varias columnas (con posiciones)
students.iloc[:,2:4]
# una fila
students.iloc[2,]
# varias filas
students.iloc[[2,3],]
Nótese en los casos anteriores, que si no indicabas filas, tenías toda la fila; y que si no indicas columnas, vienen todas las columnas. Si solo quieres un valor:
students.iloc[1,3]
Es muy común, y necesario, crear subsets del DF:
studentsNoEd=students.iloc[:,[0,1,2]]
studentsNoEd
Voy a hacer algunos cambios a este DF. Sin embargo, es común primero crear una copia del original:
studentsCopy=students.copy()
studentsCopy
Ahora, a la copia le hago modificaciones.
# cambio el valor de una edad:
studentsCopy.iloc[0,1]=23 # No hay advertencia, el cambio ya se hizo:
studentsCopy
# Podemos tener una nueva columna con valores vacios
studentsCopy.country=None
studentsCopy
# Y puedeo eliminar una columna:
studentsCopy.drop('ages',1,inplace=True) # axis=1 is column
studentsCopy
Una de las primeras cosas que hacemos con los DF es hacerle consultas:
# ¿Quién es el más viejo del grupo?
students[students.ages==max(students.ages)].names
#students.loc[students['ages'].idxmax()].names
# ¿Quién es el más joven del grupo?
students[students.ages==min(students.ages)].names
#students.loc[students['ages'].idxmin()].names
# ¿Quién tiene más de 30 y es de China?
students[(students.ages>30) & (students.country=='China')] # parentesis requeridos
# ¿Quién no viene de Noruega?
students[students.country!="Norway"]
# ¿Quién no viene de estos lugares?
places=["China", "Spain"]
students[~students.country.isin(places)]
# Muestrame el DF ordenado decrecientemente por edad**
toSort=["ages"]
Order=[False]
students.sort_values(by=toSort,ascending=Order)
# Muestrame el DF ordenado crecientemente, por educacion y luego por edad
toSort=["education","ages"]
Order=[True,True]
students.sort_values(by=toSort,ascending=Order)
AUSPICIO:
El desarrollo de estos contenidos ha sido posible gracias al grant del Berkeley Initiative for Transparency in the Social Sciences (BITSS) at the Center for Effective Global Action (CEGA) at the University of California, Berkeley
RECONOCIMIENTO
El autor reconoce el apoyo que el eScience Institute de la Universidad de Washington le ha brindado desde el 2015 para desarrollar su investigación en Ciencia de Datos.