¡Esta es una revisión vieja del documento!
Pandas es una librería en cierto sentido similar a NumPy. Pero si NumPy únicamente contiene vectores, matrices, tensores ,etc junto con operaciones matemáticas. Con pandas tenemos mas cosas como nombrar a las columnas con un nombre , incluir un índices o generación de gráficas.
Mas información:
1 |
import pandas as pd |
DataFrame
1 2 3 4 5 6 7 8 9 10 |
tipo = [ 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' ] capacidad = [ 0.5 , 0.5 , 0.24 , 0.48 , 1 , 0.512 , 1 , 0.48 , 0.12 , 0.96 , 0.256 , 0.512 , 1 , 2 , 0.5 , 2 , 2 , 1 , 1.5 , 4 , 2 , 4 , 6 , 5 , 8 , 10 , 12 , 14 , 16 , 18 ] precio = [ 101 , 51 , 27 , 44 , 86 , 101 , 138 , 50 , 22 , 83 , 41 , 78 , 126 , 183 , 91 , 48 , 51 , 37 , 55 , 81 , 48 , 88 , 187 , 146 , 240 , 360 , 387 , 443 , 516 , 612 ] data = zip (tipo,capacidad,precio) columns = [ 'tipo' , 'capacidad' , 'precio' ] df = pd.DataFrame(data, columns = columns) |
zip
es similar a np.column_stack
de numpy pero ha usado zip
en vez de column_stack
ya que hay datos de tipos string
. Si todos los datos hubieran sido números de podría haber usado column_stack
append
.
1 |
df = df.append({ 'tipo' : "SSD" , "capacidad" : 1 , "precio" : 214 },ignore_index = True ) |
Mas información:
1 |
df.to_csv( "datos.csv" , index = False ) |
index=False
ya que sino creará en disco una columna extra con el nº de la fila a modo de índice
tipo,capacidad,precio SSD,0.5,101 SSD,0.5,51 SSD,0.24,27 SSD,0.48,44 ........ HDD,14.0,443 HDD,16.0,516 HDD,18.0,612 SSD,1.0,214
1 |
df = pd.read_csv( "datos.csv" ,sep = "," ) |
1 2 3 4 |
import sqlalchemy connection = sqlalchemy.create_engine( 'mysql+pymysql://mi_usuario:mi_contrasenya@localhost:3306/mi_database' ) df = pd.read_sql( "SELECT * FROM mi_tabla" ,con = connection) |
Crear un DataFrame desde una base de datos relacional es tan sencillo como crear la conexión con sqlalchemy.create_engine
y luego con pandas llamar a read_sql
.
1 |
conda install -c anaconda sqlalchemy |
1 |
df.info() |
<class 'pandas.core.frame.DataFrame'> RangeIndex: 31 entries, 0 to 30 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 tipo 31 non-null object 1 capacidad 31 non-null float64 2 precio 31 non-null int64 dtypes: float64(1), int64(1), object(1) memory usage: 872.0+ bytes
1 |
df.shape |
(31, 3)
1 |
df.head() |
tipo capacidad precio 0 SSD 0.50 101 1 SSD 0.50 51 2 SSD 0.24 27 3 SSD 0.48 44 4 SSD 1.00 86
1 |
df.tail() |
tipo capacidad precio 26 HDD 12.0 387 27 HDD 14.0 443 28 HDD 16.0 516 29 HDD 18.0 612 30 SSD 1.0 214
1 |
df.describe() |
capacidad precio count 31.000000 31.000000 mean 3.760000 152.741935 std 5.049022 153.423807 min 0.120000 22.000000 25% 0.506000 50.500000 50% 1.000000 88.000000 75% 4.500000 185.000000 max 18.000000 612.000000
1 |
df.precio.mean() |
150.7
1 |
df.precio.std() |
155.617601610597
1 |
df.corr() |
capacidad precio capacidad 1.000000 0.949407 precio 0.949407 1.000000
Lo normal es que queramos acceder a los datos siempre por columnas. Así que explicaremos únicamente esa forma.
1 2 3 |
df[ 'capacidad' ] df.loc[:, 'capacidad' ] df.capacidad |
loc
hay que indicar que queremos todas las filas para ello usamos el :
1 2 |
df[[ 'precio' , 'capacidad' ]] df.loc[:,[ 'precio' , 'capacidad' ]] |
1 |
df.loc[:,df.columns! = 'tipo' ] |
1 2 3 |
df df[:] df.loc[:,:] |
1 |
df.iloc[:, 1 ] |
1 |
df.iloc[:, - 1 ] |
1 |
df.iloc[:,[ 0 , - 1 ]] |
1 |
df.columns |
['tipo', 'capacidad', 'precio']
1 |
len (df.columns) |
1 |
df.columns[ 0 ] |
rename
. Se pasa un diccionario cuya clave es el nombre actual y el valor es el nuevo nombre.
1 2 3 |
#Cambiamos el nombre de la columna "tipo" al nuevo nombre "target" df.rename(columns = { 'tipo' : 'target' }, inplace = True ) new_df = df.rename(columns = { 'tipo' : 'target' }) |
inplace=True
se hace la modificación en el propio DataFrame
y no hace falta asignarlo a otro nuevo DataFrame
target
reindex
1 2 |
#Ahora la columna target está al final df = df.reindex(columns = [ 'capacidad' , 'precio' , 'target' ]) |
DataFrame
a un nuevo DataFrame
velocidad
al inicio del DataFrame
1 2 3 |
datos_nueva_columna = [ 1000 , 1250 , 6500 , 2500 , 2750 , 2500 , 1000 , 1500 , 2250 , 5500 , 2750 , 4250 , 5000 , 3750 , 2500 , 6500 , 5250 , 5250 , 3250 , 3500 , 7250 , 6250 , 2250 , 3500 , 4250 , 6000 , 2000 , 3000 , 5250 , 2500 ] df.insert( 0 , "velocidad" ,datos_nueva_columna) |
velocidad
antes del "precio"
1 2 3 4 |
datos_nueva_columna = [ 1000 , 1250 , 6500 , 2500 , 2750 , 2500 , 1000 , 1500 , 2250 , 5500 , 2750 , 4250 , 5000 , 3750 , 2500 , 6500 , 5250 , 5250 , 3250 , 3500 , 7250 , 6250 , 2250 , 3500 , 4250 , 6000 , 2000 , 3000 , 5250 , 2500 ] df.insert( 2 , "velocidad" ,datos_nueva_columna) |
1 |
df.insert( 3 , "calculada" ,df.precio * df.capacidad) |
tipo capacidad precio calculada 0 SSD 0.50 101 50.50 1 SSD 0.50 51 25.50 2 SSD 0.24 27 6.48 3 SSD 0.48 44 21.12 4 SSD 1.00 86 86.00 ...........
1 2 |
#Pasamos de euros a dolares df.precio = df.precio * 1.13 |
calculada
1 2 |
df.drop(columns = [ 'calculada' ], inplace = True ) new_df = df.drop(columns = [ 'calculada' ]) |
1 |
df[df.tipo = = 'SSD' ] |
1 |
df[(df.tipo = = 'SSD' ) & (df.precio< 100 )] |
DataFrame
así que se pueden aplicar todos los métodos de los DataFrame
.
1 |
df.tipo.unique() |
array(['SSD', 'HDD'], dtype=object)
Vamos ahora a crear un DataFrame con datos inválidos.
1 2 3 4 5 6 7 8 9 10 11 |
tipo = [ None , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'SSD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' , 'HDD' ] capacidad = [ 0.5 , math.nan, 0.24 , None , 1 , 0.512 , 1 , 0.48 , 0.12 , 0.96 , 0.256 , 0.512 , 1 , 2 , 0.5 , 2 , 2 , 1 , 1.5 , 4 , 2 , 4 , 6 , 5 , 8 , 10 , 12 , 14 , 16 , 18 ] precio = [ 101 , 51 , math.nan, 44 , None , 101 , 138 , 50 , 22 , 83 , 41 , 78 , 126 , 183 , 91 , 48 , 51 , 37 , 55 , 81 , 48 , 88 , 187 , 146 , 240 , 360 , 387 , 443 , 516 , 612 ] data = zip (tipo,capacidad,precio) columns = [ 'tipo' , 'capacidad' , 'precio' ] df = pd.DataFrame(data, columns = columns) |
NaN
o None
de cada columna
1 |
df.isnull(). sum () |
tipo 1 capacidad 2 precio 2 dtype: int64
NaN
o None
1 2 |
df = df.dropna() df.isnull(). sum () |
tipo 0 capacidad 0 precio 0 dtype: int64
Con dataframes lo sencillo usar seaborn
1 2 3 4 |
figure = plt.figure(figsize = ( 12 , 8 )) axes = figure.add_subplot() sns.scatterplot(x = "capacidad" , y = "precio" , hue = "tipo" ,data = df,ax = axes) |
1 2 3 4 5 |
figure = plt.figure(figsize = ( 16 , 5 )) axes = figure.add_subplot( 1 , 2 , 1 ) sns.kdeplot(x = "capacidad" ,data = df,fill = True ,ax = axes) axes = figure.add_subplot( 1 , 2 , 2 ) sns.kdeplot(x = "precio" ,data = df,fill = True ,ax = axes) |
1 2 3 4 5 |
figure = plt.figure(figsize = ( 16 , 5 )) axes = figure.add_subplot( 1 , 2 , 1 ) sns.kdeplot(x = "capacidad" ,hue = "tipo" ,data = df,fill = True ,ax = axes) axes = figure.add_subplot( 1 , 2 , 2 ) sns.kdeplot(x = "precio" ,hue = "tipo" ,data = df,fill = True ,ax = axes) |
1 2 3 4 5 |
figure = plt.figure(figsize = ( 16 , 5 )) axes = figure.add_subplot( 1 , 2 , 1 ) sns.histplot(x = "capacidad" ,hue = "tipo" ,data = df,ax = axes) axes = figure.add_subplot( 1 , 2 , 2 ) sns.histplot(x = "precio" ,hue = "tipo" ,data = df,ax = axes) |
1 |
pairplot = sns.pairplot(df,hue = "tipo" ) |
Crea un DataDrame con los datos que proporciona load_iris
. Recuerda que la propiedad feature_names
retorna los nombres. La la columna de los tipos de flor la debes llamar tipo_flor
index=False
y mira la diferencia con el anterior fichero.Crear una gráfica de scatter
2a Crear df con lista de cilindradas y precio 2b Crear una gráfica
3 Cargar un df desde kaggle con tiempos mostrar el nº de filas y el nº de features mostrar el nombree de las columnas que tiene ver los tipos de datos renombrar columna a target ver los valores que son null poner una de las columnascon null a la media borrar las filas de las columnas con null crear una nueva columna de fecha ver los datos único de laguna columna de "label", tansformar esa columna de label a números
4 Crear df con iris 4b kde de la primera columna 4c funcion de la gráfica 4b Hacer las gráficas de KDE de todos por índice y poniendo el nombre
4a:Repetir ejercicio del tema de numpy con los datos y guardarlo en csv 4b:Cargar los datos y mostrar los datos
5a:Repetir ejercicio del tema de gráficas de history con los datos y guardarlo en csv 5b:Cargar los datos y mostrar los datos