Cambiar el nombre a una columna con Pandas

logo python

Las vías que conozco,  para cambiar el nombre a una columna son tres . Podemos hacerlo con el método rename(), el cual puede aplicarse directamente a la columna, o pasarlo a través de una funcion lambda.

Ojo, es posible que haya más posibilidades, me refiero a las que uso y conozco.

Cambiar el nombre a una columna con Pandas

El método rename(),  se utiliza justo para modificar la etiqueta de los ejes, al aplicarlo nos devolverá un nuevo dataframe con los valores aplicados. Su sintaxis es:

dataframe.rename(mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None, errors='ignore')

maper: Ya sea un diccionario o una función , indica las transformación a aplicar  al eje dado. Este parámetro y el eje se emplean para indicar que valores y ejes recibirán el cambio.

index: Nos permite establecer el eje. Si empleamos maper, index =0 , es lo mismo que maper = index

columns: Indica las columnas, si su valor es cero o se ignora, significa que es el mismo que maper.

axis: tiene por defecto el valor 0, que indica el índice, el valor 1 indica columnas. Pueden emplearse colocando el nombre del eje(índice, columnas), o el numero (0,1). El valor que recibe por defecto es el del índice.

copy: Su valor determinado es True, y esto garantiza copiar también los datos subyacentes.

inplace: valor por defecto False, si se convierte a True, al devolver el nuevo dataframe la copia anterior se ignora.

level: valor por defecto None, indica el numero o nombre del nivel. Si existen índices multiples solo modificara en el nivel indicado.

error: acepta raise o ignore, y ese último es su valor por defecto. Ignora el error del tipo keyerror, cuando index o columns contienen etiquetas que no existen.

Tenemos el siguiente dataframe:

Aplicándolo directamente seria algo asi:

Renombramos varias columnas usando mapping en las columnas Unnamed: 0 e Ischaemic heart disease, para ello pasamos los valores nuevos, en forma de diccionario.

Renombremos ahora los indices

Esto también podría lograrse escribiendo

data_df.rename({0: 'Año1', 1: 'Año1', 2: 'Año3'}, axis='index')

Incluso podemos cambiar el estilo :

A través de una función lambda:

Y esto es todo

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias

…. hay que levantarse cada mañana con una esperanza y dormirse cada noche con una meta….

Y

Redondear decimales en Pandas con round y decimal

En esta ocasión hablare del uso de round() y decimal().

Ya en antes, he hablado, de lo que significa, y cómo aplicar el redondeo de la mejor forma posible en Python.

Sabemos, que existen múltiples ocasiones, en las que podemos necesitar sustituir un valor de tipo entero, por otro con una cantidad de decimales dada;  o directamente asignar solo una cantidad de decimales a todos los valores dentro de una dataframe.

Veamos un ejemplo para mostrar las diferentes opciones.

Primero importamos las librerías.

Importamos el dataframe

Usando round() en Pandas

Es una función que  redondea un número de coma flotante, al número de lugares decimales proporcionados como segundo argumento de la función.

Su sintaxis es round(value, numero de decimales)

En este ejemplo redondeamos la columna 2 de un dataframe

Primero aplicamos la función series() de Pandas, definimos la función round() con los espacios que deseamo, para luego aplicar un bucle for, para recorrer la columna.  

En este caso la labor de round(), es colocar una coma flotante, y dejar la cantidad de decimales que le indicamos al redondear, como segundo parámetro.

Format() como apoyo

Otra forma, es utilizar format(), pero como su nombre indica, por si sola, no redondea, sino que formatea la salida de la cadena, dandole la estructura que deseamos.

format() es una propiedad de string, o sea trabaja con una cadenas, y por lo tanto no debe confundirse con valores numéricos

La sintaxis es algo como lo que sigue, cuando la usamos en solitario, aunque existen multiples combinaciones para aplicar formato.

En este caso estamos formateando la salida de un valor a porcentaje con solo dos decimales.

df['columna3'] = pd.str(["{0:.2f}%".format(val * 100) for val in df[' columna3']])

El formato de cadena le permite representar los números como desee. Puede cambiar el número de lugares decimales que se muestran cambiando el número antes de la f.  

Usando Decimal

Cuando necesitamos una adecuada precisión es recomendable usar decimal, ya que es mucho mas adecuado que round(), si buscamos exactitud.

Puedes ver este articulo sobre la diferencia entre round() y decimal()

La construcción de la sintaxis es como se ve en el ejemplo:

En el primer caso, solo ejecutamos una división, donde obtenemos un número de coma flotante.

En los ejemplos siguientes, lo que hacemos en indicarle a Python que estamos esperando un resultado en formato decimal.

En el segundo tomamos algunas de las propiedades del contexto y le decimos a Decimal que tipo de redondeo queremos.

En el tercer y ultimo calculo, solo tomamos el contexto predeterminado e indicamos el nivel de precision que deseamos.

En todos los casos hemos redondeado a dos espacios pero podríamos haber fijado cualquier cantidad de dígitos, que necesitáramos.

..se me ha olvidado ya el lugar de donde vengo, y puede que no exista el sitio adonde voy…

J.Sabina

TypeError: ‘Index’ object is not callable

logo python

Si ante recibes este error al escribir esto en Pandas:

data_df.columns()

Se debe a que están intentado llamar el método de modo incorrecto.

Es un error común de principiante, porque intentas obligar a Pandas a que use cómo índice el propio índice que el establece.

El objeto index no puede llamarse , porque no es un atributo del dataframe, entonces no puede llamarlas de ese modo, según el concepto de la librería.

Por la misma causa podrías recibir el error SyntaxError: invalid syntax

Solución

data_df.columns

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias

“Sin   herramientas para imaginar tu secreto…..”

Y

Error. cannot convert non-finite values (NA or inf) to integer. Pandas

logo python

Si recibes este error, lo más probable es que en tu dataset, existan datos vacíos que no ves.

Sobre todo si has estado convirtiendo valores en Excel y posees un archivo de datos grandes, puede aparecer este error, al intentar convertir tus datos a enteros.

Solución:

Aplica al dataframe el método fillna(0), estarás llenando esos valores con valor 0, con esta sintáxis

data_df= data_df.fillna(0)

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias

“El amor es dos en uno que al final no son ninguno y se acostumbran a mentir”

R.Arjona

Diferencias entre apply, map y applymap

logo python

El uso de estas funciones, para multiples labores en Python, nos permiten obtener resultados de un modo que nos arreglan bastante la vida.

Muchas de estas veces nos apoyamos para ello en funciones lambda, por su simplicidad, veamos un poco, de que hablo.

Funciones lambda

Otro modo de aplicar redondeo es utilizar una función  lambda en un array de una dimensión, o sea para una columna o fila.

Las funciones lambdas, son una poderosa herramienta de Python, que nos permite escribir un tipo de función, que se ejecuta en un línea.

Hablo un poco sobre la funciones lambda en este articulo que escribi hace un tiempo.

Apoyándonos en ellas,  podemos redondear, utilizando diferentes funciones que trabajan a partir de elementos.

Recordemos que en Python todo son objetos, las funciones map  y applymap, se  basan ambas en este concepto.

La diferencia entre ellos es que applymap es un función basada en elementos que trabaja en el dataframe, mientras map lo hace en las series, o sea una columna o una fila.

En el ejemplo verán la aplicación de map() en una columna y applymap() en todo el dataframe, en ambos casos se combina su uso con la función format, y  una función lambda para determinar los términos del redondeo.

Existe una buena explicación de la diferencia entre estas funciones en este link


Map

Applymap

Como hemos ya modificado una columna volvemos a importar nuestro dataset y aplicamos applymap()

Diferencias entre Map, applymap, y apply

map() es una función basada en elementos que solo se aplica a series, acepta dict, series o callables.

Está diseñada para mapear valores de un dominio a otro, por lo que está optimizada para el rendimiento.

Su construcción, como vimos antes es del tipo :

df['A'].map({1:'a', 2:'b', 3:'c'}))

applymap(), es una función también basada en elementos, que  solo se aplica a Dataframes, y únicamente acepta callables.

applymap() es perfecto, para transformar de elementos en varias filas / columnas, sin que sea necesario utilizar apply()

df[['A', 'B', 'C']].applymap(str.strip))

apply(), se basa también, en elementos, pero puede tener otras complejidades y su compartamiento y resultado, depende de la función.

Se aplica, tanto a series como dataframes , y solo acepta callables

Es importante saber que se usa cuando en cualquier función que no puede ser vectorizada

Otros elementos a tener en cuenta son:

map() cuando se le pasa un diccionario o serie mapeará elementos basados ​​en sus claves Los valores faltantes se registrarán como NaN en la salida.

applymap() puede funcionar un poco más rápido que apply en algunos casos.  

map() está optimizado para mapeos y transformaciones por elementos. Las operaciones que involucran diccionarios o series permitirán a  Pandas usar rutas de código más rápidas para un mejor rendimiento.

apply() devuelve un escalar para agregar operaciones, también tiene rutas rápidas cuando se llama con ciertas funciones NumPy como mean, sum, etc.

… también en el infierno llueve sobre mojado, lo se porque he pasado, más de una noche allí…

J.Sabina

Indicar el separador en archivo csv en Mac, con Python(sep).

logo python

Ante todo, esta es una solución para personas que trabajen con Python y la librería Pandas, para no programadores, la solución es otra.

Un problema común, es que al crear un archivo csv, cometamos una equivocación y nuestro archivo no se visualice correctamente, lo que nos traerá problemas, sí como es mi caso quiero emplearlo como dataset en Python.

Digamos que tengo un archivo del tipo  Excel, con dos columnas “vendedores” y “ventas”.

La columna “vendedores” tiene valores enteros, y la columna “ventas”, valores decimales.

La dificultad a la que nos enfrentamos es que en Mac, para cambiar el separador hay que ir hasta el propio registro que establece los separadores decimales, de todo el sistema, ya sea directamente o mediante comandos(solución para no programadores).

Siendo como soy, enemigo de tocar lo que no debo tocar, para evitar errores futuros de los cuales olvidaré la causa, busqué una solución más sencilla, que ya existe en el “abc” de Pandas. El argumento sep().

Cuando creaba un csv, ya sea en formato UTF 8, o csv para Mac,  lo que hacia era separarme las filas por , coma y no punto y coma.

Pandas resuelve esto fácilmente, con él parámetro sep(), que permite escoger el separador en una cadena dada.

Veremos la salida del mismo archivo dos veces, sin utilizar sep y dándole uso.

Sin usar sep

 Utilizando sep

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias

Y yo tenia respuesta a todas sus preguntas, incluso a las que aún no se ha hecho.

Y