Transformaciones y Manipulación de Datos con Pandas en Python
Resumen
¿Cómo transformar datos para análisis más avanzado en Pandas?
Transformar y analizar datos es fundamental en cualquier proyecto de ciencia de datos. Poder crear nuevas columnas, realizar transformaciones básicas y avanzadas, y aplicar funciones como Lambda y Apply, permite un manejo más preciso y eficiente de la información. En este artículo, exploraremos cómo manipular un DataFrame utilizando Pandas para preparar datos para análisis avanzados.
¿Cómo crear una nueva columna combinando datos existentes?
Un método efectivo para extraer información valiosa es la creación de nuevas columnas a partir de las ya existentes. En este caso, usaremos un archivo CSV como fuente de datos. Al importar Pandas y el CSV, se puede manipular el DataFrame para crear la columna TotalPrice multiplicando la cantidad por el UnitPrice.
import pandas as pd
df = pd.read_csv('data.csv')# Cambia 'data.csv' al nombre de tu archivodf['TotalPrice']= df['cantidad']* df['UnitPrice']print(df.head())
Este proceso genera una nueva columna TotalPrice que contiene el resultado de multiplicar las cantidades por el precio unitario.
¿Cómo aplicar condiciones para crear nuevas columnas?
Las condiciones pueden usarse para crear columnas con valores booleanos. Supongamos que queremos determinar si el TotalPrice es mayor de 100. Esto puede ser fácilmente realizado con una comparación dentro del DataFrame.
Aquí, HighValue será True para filas donde el total supera los 100, permitiendo rápidamente identificar valores altos.
¿Qué tipo de dato tiene cada columna y cómo cambiarlo?
Pandas asigna automáticamente un tipo a cada columna, pero a veces necesitamos cambiarlo para un manejo más eficiente. Supongamos que InvoiceDate está etiquetado como un objeto, pero queremos convertirlo en un tipo de tiempo.
Esto convierte InvoiceDate a un tipo DateTime, mejorando la manipulación de datos temporales.
¿Cómo usar lambdas para transformaciones de datos?
La función Lambda es ideal para transformaciones rápidas y personalizadas. Por ejemplo, si deseamos aplicar un descuento del 10% al precio unitario, podemos usar Lambda de la siguiente manera:
df['DiscountedPrice']= df['UnitPrice'].apply(lambda x: x *0.9)print(df[['UnitPrice','DiscountedPrice']].head())
DiscountedPrice muestra el precio después de aplicar el descuento.
¿Cómo categorizar precios con funciones personalizadas?
No solo los datos numéricos pueden ser transformados, también es posible categorizar datos con funciones personalizadas. Aquí crearemos una función para asignar categorías de precio:
Con esta función, el UnitPrice se categoriza en 'High', 'Medium' o 'Low' basado en su valor. Esto ayuda a segmentar fácilmente los datos para análisis más detallados.
Transformar y manipular datos con Pandas no solo mejora el análisis, sino que también facilita la comprensión del contenido. Experimenta y prueba nuevas formas de enriquecer el dataset. ¿Qué otras columnas podrían agregar valor a tu proyecto? ¡La exploración sigue abierta!
El error se debe a que la función original categoriza incorrectamente los precios. La condición price < 20 asigna todos los valores menores a 20 a la categoría 'Medium', lo que deja sin posibilidad de asignar ningún valor a la categoría 'Low'.
La categoria LOW toma los valores >20 y <50, no tiene sentido logico, pero si recibe esos valores.
Una de las columnas que pueden aportar al proyecto es identificar si la transacción es una venta o una devolución, ya que en la columna "Quantity" hay valores en negativo:
Aqui es donde yo con mucho respeto digo que en ocasiones a Platzi se le van las luces con los ejemplos, ya que son poco orientados a casos reales de negocio.
Aplicar lambdas a columnas es muy usado en ETLs cuando se hace ingeniería de datos, pero para un simple descuento con poner:
Se obtiene el mismo resultado. Me parece que esto enseña prácticas poco óptimas, a pesar de esto, el curso hasta el momento está genial.
En la línea df['PriceCategory'] = df['UnitPrice'].apply(categorize_price), no se envían argumentos directamente a la función categorize_price porque el método apply de un DataFrame de Pandas itera automáticamente sobre cada elemento de la serie que se le pasa (en este caso, df['UnitPrice']). Esto significa que apply pasa cada valor de UnitPrice a la función categorize_price uno por uno, permitiendo que la función opere sobre cada elemento sin necesidad de especificar argumentos adicionales.
Tenía esa duda, muchas gracias!
Separar por contenientes:
Lo hice en base al código de otro compañero. Créditos a él.
Obteniendo la lista de los países creé una columna según su continente:
Obtener países:
countries = retail_data['Country'].value_counts()countries
``````js
CountryUnitedKingdom22281Germany309France287EIRE177Norway147Portugal80Spain45Lithuania35Iceland31Italy25Australia22Denmark20Japan17ChannelIslands17Belgium12Poland8Switzerland6Netherlands2dtype: int64
Crear columna "getContinent":
defgetContinent(Country):if Country =='Japan':return'Asia'elif Country =='Australia':return'Oceania'else:return'Europe'df['Continent']= df['Country'].apply(getContinent)
Me parece que en tu código omites paises y se clasificarian como europeas ciudades que no lo son:countries = data['Country'].unique()print(countries)
countries = data['Country'].unique()print(countries)def continent(country):if country in['Japan','Bahrain','Hong Kong','Singapore','Lebanon','United Arab Emirates','Saudi Arabia','Israel']:return'Asia' elif country =='Australia':return'Oceania' elif country in['Brazil','Canada','USA']:return'America' elif country =='RSA':return'Africa' elif country =='Unspecified':return'Unspecified'else:return'Europe'data['Continent']= data['Country'].apply(continent)data
def categorize_price(price):if price >=50:return'High' elif price <20:return'Low'else:return'Medium'df['PriceCategory']= df['TotalPrice'].apply(categorize_price)print(df.head(20))```Para el ejemplo de la parte final, para que la función de categorizar a los precios funcione correctamente, una opción seria enviarle la columna de 'TotalPrice' y no la de 'UnitPrice' debido a que en nuestras condiciones no estamos usando las escalas adecuadas, y además también es necesario corregir el segundo elif, ya que en el ejemplo tenemos como high a los valores >50, pero al poner la segunda condicion medium a los precios <20, los valores que oscilen entre 20 y 49 se clasificaran como low. 
Creo que podría incluirse una nueva columna de Taxes. Y con esto sabemos otro valor que es la utilidad real.
otras columnas podrían ser: total descuento, frecuencia de compra,
MOdelo coworcountry o modelo coworculture con muchas actividades para pausas activas y acompañamiento de tu rol profesional Recuerda que Estamos enfocados en atender y brindar espacios para nomadas digitales, teletrabajo y coworking space en Agrolenials Paradise Ecohostel Country Inns contacto directo whatsapp +573206299333 y Faccebook
InvoiceDate UnitPrice CustomerID Country TotalPrice \
0 2010-12-01 08:26:00 2.55 17850.0 United Kingdom 15.30
1 2010-12-01 08:26:00 3.39 17850.0 United Kingdom 20.34
2 2010-12-01 08:26:00 2.75 17850.0 United Kingdom 22.00
3 2010-12-01 08:26:00 3.39 17850.0 United Kingdom 20.34
4 2010-12-01 08:26:00 3.39 17850.0 United Kingdom 20.34
HighValue DiscountedPrice PriceCategory Total Factura
0 False 2.295 Medium 13.770
1 True 3.051 Medium 18.306
2 True 2.475 Medium 19.800
3 True 3.051 Medium 18.306
4 True 3.051 Medium 18.306
De esta manera manejamos quantiles para darle categorías mas aterrizadas al DF
DateTime en Pandas se utiliza para manejar y manipular datos de fecha y hora. Permite realizar operaciones como la conversión de cadenas a fechas, la extracción de componentes (día, mes, año), y realizar cálculos sobre estos datos, como sumar o restar períodos de tiempo. En el contexto de la clase, se vio cómo transformar una columna de fechas en un DataFrame a tipo DateTime para facilitar análisis posteriores. Esto es crucial para trabajar con datos temporales y hacer análisis que dependen de la dimensión temporal, como tendencias o series de tiempo.
De donde saca el archivo online_retail.csv
Lo descarga desde Kaggle, en las primeras clases del curso menciona como descargarlo
La función read_csv lee el conjunto de datos desde el archivo online_retail.csv y lo almacena en un DataFrame df.
Se agrega una nueva columna TotalPrice, calculada como el producto de las columnas Quantity y UnitPrice.
La función head() muestra las primeras cinco filas del DataFrame actualizado.
Resultado Esperado: Las primeras cinco filas del conjunto de datos, incluyendo la nueva columna TotalPrice, que contiene los valores calculados.
2. Creación de una Columna High-Value
df['HighValue'] = df['TotalPrice'] > 16
print(df['HighValue'].head(10))
Descripción:
Se agrega una nueva columna HighValue al DataFrame, donde cada valor es True si TotalPrice es mayor a 16, y False en caso contrario.
Las primeras 10 filas de la columna HighValue se muestran con el método head().
Resultado: Las primeras 10 filas de la columna HighValue, que contienen valores booleanos (True o False) basados en el umbral de TotalPrice.
3. Visualización de Información del DataFrame
print(df.info())
Descripción:
El método info() se utiliza para mostrar un resumen del DataFrame, que incluye el número de valores no nulos, tipos de datos por columna y uso de memoria.
Resultado: Un resumen que muestra:
Número de entradas (RangeIndex).
Nombres de columnas, conteo de valores no nulos y tipos de datos.
Convierte la columna InvoiceDate a formato datetime utilizando pd.to_datetime.
El tipo de datos actualizado se refleja en el resultado del método info().
Resultado: El tipo de datos de la columna InvoiceDate cambia a datetime64[ns], como se muestra en el resumen del DataFrame.
5. Creación de una Columna de Precio con Descuento
df['DiscountedPrice'] = df['UnitPrice'].apply(lambda x: x * 0.9)
print(df.head(3))
Descripción:
Se crea una nueva columna DiscountedPrice, donde cada valor es el 90% del UnitPrice (aplicando un descuento del 10%). Esto se logra usando la función apply con una expresión lambda.
Se muestran las primeras tres filas del DataFrame actualizado.
Resultado Esperado: Las primeras tres filas del DataFrame, incluyendo la nueva columna DiscountedPrice con los precios descontados.
Se define una función personalizada categorize_price para clasificar precios en categorías:
'High' para precios mayores a 50.
'Medium' para precios menores a 20.
'Low' para todos los demás precios.
La función se aplica a la columna UnitPrice utilizando apply, y los resultados se almacenan en una nueva columna PriceCategory.
Se muestran las primeras tres filas del DataFrame actualizado.
Resultado Esperado: Las primeras tres filas del DataFrame, incluyendo la nueva columna PriceCategory con clasificaciones de precios (High, Medium o Low).
Muchas clases de Python, pandas, de esto y de aquello... y aun no veo una utilidad que el mismo excel no de, por si mismo
La diferencia con excel es que si tuviera un archivo con millones de filas nisiquiera abriria o se demoraria demasiado en caso de que sea un archivo grande y pueda abrirlo. Mientras que desde python se demora segundos haciendo procesasiemto de todos estos datos, filtrando, graficando, etc.
ufff, si has usado Excel para manejar grandes cantidades de datos o simplemente obtener insights de tus datos, creo que te enamoras de todo lo que Python puede ofrecer.