Funciones avanzadas de Pandas
Pandas ofrece funciones de manipulación de datos muy potentes, adecuadas para tareas complejas de limpieza, análisis, agregación y procesamiento de series temporales. Dominar las funciones avanzadas de Pandas puede mejorar en gran medida la eficiencia del procesamiento y análisis de datos.
1. Combinación y unión de datos
Pandas proporciona varios métodos para combinar y unir diferentes DataFrames, comomerge()、concat()yjoin(). Estos métodos se utilizan a menudo para manejar múltiples conjuntos de datos y tareas de combinación complejas.
1. merge()— Unión estilo base de datos
merge()El método permite combinar dos DataFrames según ciertas columnas, similar a la operaciónJOINen SQL. Admite uniones internas, externas, izquierdas y derechas.
| Parámetro | Descripción |
|---|---|
left |
DataFrame izquierdo |
right |
DataFrame derecho |
how |
Método de combinación, admite'inner', 'outer', 'left', 'right' |
on |
Nombres de columnas para la unión (si los nombres de columna difieren entre ambos lados, se puede usarleft_onyright_on) |
left_on |
Columna de unión del DataFrame izquierdo |
right_on |
Columna de unión del DataFrame derecho |
suffixes |
Añadir sufijos para distinguir nombres de columna duplicados |
Ejemplo
# Datos de ejemplo
left = pd.DataFrame({'ID': [1, 2, 3], 'Name': ['Alice', 'Bob', 'Charlie']})
right = pd.DataFrame({'ID': [1, 2, 4], 'Age': [24, 27, 22]})
# Usar merge para una unión interna
result = pd.merge(left, right, on='ID', how='inner')
print(result)
Salida:
ID Name Age 0 1 Alice 24 1 2 Bob 27
2. concat()— Concatenación a lo largo de un eje
concat()Se utiliza para concatenar múltiples DataFrames a lo largo de un eje especificado (filas o columnas), comúnmente para combinar filas (concatenación vertical) o combinar columnas (concatenación horizontal).
| Parámetro | Descripción |
|---|---|
objs |
Lista de DataFrames que se deben combinar |
axis |
Eje de concatenación,0indica combinar por filas,1indica combinar por columnas |
ignore_index |
Si se ignora el índice y se regenera (por defecto esFalse) |
keys |
Proporcionar un índice jerárquico para los objetos combinados |
Ejemplo
# Datos de ejemplo
df1 = pd.DataFrame({'A': [1, 2, 3]})
df2 = pd.DataFrame({'A': [4, 5, 6]})
# Combinación por filas
result = pd.concat([df1, df2], axis=0, ignore_index=True)
print(result)
Salida:
A 0 1 1 2 2 3 3 4 4 5 5 6
3. join()— Unión basada en el índice
join()El método es una operación de unión simplificada en Pandas, generalmente utilizada para unir múltiples DataFrames basándose en el índice.
| Parámetro | Descripción |
|---|---|
other |
Otro DataFrame que se debe unir |
how |
Método de combinación, admite'left', 'right', 'outer', 'inner' |
on |
Columna de unión utilizada; por defecto se basa en el índice |
Ejemplo
# Datos de ejemplo
left = pd.DataFrame({'A': [1, 2, 3]}, index=[1, 2, 3])
right = pd.DataFrame({'B': [4, 5, 6]}, index=[1, 2, 4])
# Usar join para unir
result = left.join(right, how='inner')
print(result)
Salida:
A B 1 1 4 2 2 5
2. Tablas dinámicas y tablas cruzadas
Pandas proporciona el métodopivot_table()para crear tablas dinámicas, y el métodocrosstab()para calcular tablas cruzadas. Las tablas dinámicas y las tablas cruzadas son muy adecuadas para resumir y reorganizar datos.
1. pivot_table()— Crear una tabla dinámica
| Parámetro | Descripción |
|---|---|
data |
Datos de entrada |
values |
Columna a resumir |
index |
Columna utilizada como índice de filas |
columns |
Columna utilizada como índice de columnas |
aggfunc |
Función de agregación, por defecto esmean, puede sersum, countesperar |
fill_value |
Rellenar valores faltantes |
Ejemplo
# Datos de ejemplo
data = {'Date': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04'],
'Category': ['A', 'B', 'A', 'B'],
'Sales': [100, 150, 200, 250]}
df = pd.DataFrame(data)
# Crear una tabla dinámica
pivot_table = pd.pivot_table(df, values='Sales', index='Date', columns='Category', aggfunc='sum', fill_value=0)
print(pivot_table)
Salida:
Category A B Date 2024-01-01 100 0 2024-01-02 0 150 2024-01-03 200 0 2024-01-04 0 250
2. crosstab()— Crear una tabla cruzada
| Parámetro | Descripción |
|---|---|
index |
Etiquetas de fila |
columns |
Etiquetas de columna |
values |
Datos utilizados para el cálculo (opcional) |
aggfunc |
Función de agregación, por defectocount |
Ejemplo
# Datos de ejemplo
data = {'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Region': ['North', 'South', 'North', 'South', 'West', 'East']}
df = pd.DataFrame(data)
# Crear una tabla cruzada
cross_table = pd.crosstab(df['Category'], df['Region'])
print(cross_table)
Salida:
Region East North South West Category A 0 2 0 1 B 1 0 1 0
3. Aplicación de funciones personalizadas
Pandas proporciona varios métodos para aplicar funciones personalizadas, utilizados en la limpieza y transformación de datos.
1. apply()— Aplicar funciones a DataFrame o Series
apply()El método permite aplicar funciones personalizadas en DataFrame o Series, y admite operaciones por filas o columnas.
| Parámetro | Descripción |
|---|---|
func |
Función que se debe aplicar |
axis |
Por defecto es0, indica aplicar por columnas;1indica aplicar por filas |
raw |
Si se pasan los datos originales (por defecto esFalse) |
result_type |
Define el tipo de salida, comoexpand, reduce, broadcast |
Ejemplo
# Datos de ejemplo
df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [10, 20, 30, 40]})
# Definir una función personalizada
def custom_func(x):
return x * 2
# Aplicar la función en las columnas
df['A'] = df['A'].apply(custom_func)
print(df)
Salida:
A B 0 2 10 1 4 20 2 6 30 3 8 40
2. applymap()— Aplicar funciones en todo el DataFrame
applymap()Solo se puede aplicar a DataFrame y actúa sobre cada elemento del DataFrame.
| Parámetro | Descripción |
|---|---|
func |
Función que se debe aplicar |
Ejemplo
# Datos de ejemplo
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
# Aplicar una función personalizada en el DataFrame
df = df.applymap(lambda x: x ** 2)
print(df)
Salida:
A B 0 1 16 1 4 25 2 9 36
3. map()— Aplicar funciones a Series
map()Puede aplicar una función o una relación de mapeo a cada elemento de una Series.
| Parámetro | Descripción |
|---|---|
arg |
Función a aplicar, diccionario o Series |
Ejemplo
# Datos de ejemplo
df = pd.DataFrame({'A': ['cat', 'dog', 'rabbit']})
# Usar un diccionario para mapear
df['A'] = df['A'].map({'cat': 'kitten', 'dog': 'puppy'})
print(df)
Salida:
A
0 kitten
1 puppy
2 NaN
4. Operaciones de agrupación y agregación
En Pandas, el métodogroupby()es muy potente; se puede utilizar para agrupar y agregar, transformar y filtrar datos. Mediantegroupby(), los datos se pueden agrupar según ciertas condiciones y realizar operaciones de agregación, como suma, media, conteo, etc.
1. groupby()— Agrupación de datos
| Parámetro | Descripción |
|---|---|
by |
Según qué columna o índice agrupar |
axis |
Eje de agrupación, por defecto es0, es decir, agrupar por filas |
level |
Agrupar según el nivel del índice (adecuado para MultiIndex) |
Ejemplo
# Datos de ejemplo
df = pd.DataFrame({
'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Value': [10, 20, 30, 40, 50, 60]
})
# Agrupar por la columna Category y calcular la suma de cada grupo
grouped = df.groupby('Category')['Value'].sum()
print(grouped)
Salida:
Category A 90 B 120 Name: Value, dtype: int64
2. Operaciones de agregación (agg())
agg()Se utiliza para realizar operaciones de agregación complejas; se pueden pasar varias funciones para calcular múltiples valores agregados a la vez.
| Parámetro | Descripción |
|---|---|
func |
Función de agregación, puede ser una cadena o una función personalizada |
Ejemplo
# Datos de ejemplo
df = pd.DataFrame({
'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Value': [10, 20, 30, 40, 50, 60]
})
# Usar agg() para realizar múltiples operaciones de agregación
grouped = df.groupby('Category')['Value'].agg([sum, min, max])
print(grouped)
Salida:
sum min max Category A 90 10 50 B 120 20 60
5. Procesamiento de series temporales
Pandas proporciona potentes funciones de procesamiento de series temporales, incluyendo análisis de fechas, conversión de frecuencias, generación de rangos de fechas, operaciones de ventanas de tiempo, etc.
1. date_range()— Generar series temporales
| Parámetros | Descripción |
|---|---|
start |
Fecha de inicio |
end |
Fecha de fin |
periods |
Número de puntos de tiempo generados |
freq |
Frecuencia (comoDrepresenta días,Hrepresenta horas, etc.) |
Ejemplo
# Generar series temporales
date_range = pd.date_range(start='2024-01-01', periods=5, freq='D')
print(date_range)
Salida:
DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05'], dtype='datetime64[ns]', freq='D')
2. Desplazamientos de fecha y hora
Usarpd.Timedelta()permite realizar operaciones de suma y resta de tiempo.
Ejemplo
# Desplazamiento de fechas
date = pd.to_datetime('2024-01-01')
new_date = date + pd.Timedelta(days=10)
print(new_date)
Salida:
2024-01-11 00:00:00
3. Operaciones de ventana temporal (Rolling, Expanding)
Usarrolling()yexpanding()métodos para operaciones de ventanas móviles y expansivas, comúnmente utilizados en cálculos como medias móviles en series temporales.
| Método | Descripción |
|---|---|
rolling() |
Calcula operaciones de ventana móvil, comúnmente usado para medias móviles, etc. |
expanding() |
Calcula operaciones de ventana expansiva, valores acumulativos |
Ejemplo
# Datos de ejemplo
df = pd.DataFrame({'Value': [10, 20, 30, 40, 50]})
# Calcular la media móvil de 3 días
df['Rolling_Mean'] = df['Value'].rolling(window=3).mean()
print(df)
Salida:
Value Rolling_Mean 0 10 NaN 1 20 NaN 2 30 20.000000 3 40 30.000000 4 50 40.000000
6. Manejo de valores faltantes
Pandas proporciona varios métodos para manejar valores faltantes (como NaN). Las operaciones comunes incluyen rellenar valores faltantes, eliminar valores faltantes, etc.
| Método | Descripción |
|---|---|
isna() |
Comprueba valores faltantes, devuelve un valor booleano |
fillna() |
Rellena valores faltantes |
dropna() |
Elimina filas o columnas que contienen valores faltantes |
Ejemplo
import numpy as np
# Datos de ejemplo
df = pd.DataFrame({
'A': [1, 2, np.nan, 4],
'B': [5, np.nan, 7, 8]
})
# Rellenar valores faltantes
df_filled = df.fillna(0)
print(df_filled)
Salida:
A B 0 1 5 1 2 0 2 0 7 3 4 8
7. Índice múltiple (MultiIndex)
Pandas proporciona la funcionalidad de índice múltiple (MultiIndex), que permite manejar estructuras de datos complejas en DataFrame o Series, especialmente adecuado para datos jerárquicos. Mediante el índice múltiple, podemos realizar operaciones como agrupación, selección, corte y agregación de datos.
1. Crear un índice múltiple
Se puede crear mediantepd.MultiIndex.from_tuples()、pd.MultiIndex.from_product()oset_index()métodos para crear un índice múltiple.
Método 1:pd.MultiIndex.from_tuples()
Utilice tuplas para crear un índice múltiple, cada tupla corresponde a un nivel de índice.
| Parámetros | Descripción |
|---|---|
tuples |
Cada tupla corresponde a un valor de índice |
names |
Nombre de cada nivel de índice (opcional) |
Ejemplo
# Crear tuplas
index_tuples = [('A', 1), ('A', 2), ('B', 1), ('B', 2)]
# Crear índice múltiple
multi_index = pd.MultiIndex.from_tuples(index_tuples, names=['Letter', 'Number'])
# Crear DataFrame
df = pd.DataFrame({'Value': [10, 20, 30, 40]}, index=multi_index)
print(df)
Salida:
Value
Letter Number
A 1 10
2 20
B 1 30
2 40
Método 2: pd.MultiIndex.from_product()
Utiliza el producto cartesiano de múltiples listas para crear un índice múltiple, adecuado para casos con muchas dimensiones de datos.
| Parámetros | Descripción |
|---|---|
iterables |
Múltiples listas o matrices |
names |
Nombre de cada nivel de índice (opcional) |
Ejemplo
# Crear múltiples listas
index_values = [['A', 'B'], [1, 2]]
# Crear índice múltiple
multi_index = pd.MultiIndex.from_product(index_values, names=['Letter', 'Number'])
# Crear DataFrame
df = pd.DataFrame({'Value': [10, 20, 30, 40]}, index=multi_index)
print(df)
Salida:
Value
Letter Number
A 1 10
2 20
B 1 30
2 40
Método 3: usarset_index()Crear un índice múltiple
set_index()El método puede convertir las columnas de un DataFrame en un índice múltiple, adecuado para crear un índice múltiple a partir de datos existentes.
| Parámetros | Descripción |
|---|---|
keys |
Nombres de columnas utilizados como índice (pueden ser una o varias columnas) |
Ejemplo
# Datos de ejemplo
data = {
'Letter': ['A', 'A', 'B', 'B'],
'Number': [1, 2, 1, 2],
'Value': [10, 20, 30, 40]
}
df = pd.DataFrame(data)
# Configurar índice múltiple
df.set_index(['Letter', 'Number'], inplace=True)
print(df)
Salida:
Value
Letter Number
A 1 10
2 20
B 1 30
2 40
2. Operaciones con índices múltiples
1. Acceder a datos con índice múltiple
Se puede acceder a los datos mediante índices jerárquicos. A través deloc[]oxs()(cross-section) se puede realizar la selección de datos de manera conveniente.
Usarloc[]para seleccionar datos:
Ejemplo
# Datos de ejemplo
data = {
'Letter': ['A', 'A', 'B', 'B'],
'Number': [1, 2, 1, 2],
'Value': [10, 20, 30, 40]
}
df = pd.DataFrame(data)
# Configurar índice múltiple
df.set_index(['Letter', 'Number'], inplace=True)
# Seleccionar la categoría 'A', todos los datos con 'Number' igual a 1
print(df.loc['A', 1])
Salida:
Value 10 Name: (A, 1), dtype: int64
Usarxs()para obtener datos cruzados:
xs()El método puede seleccionar cortes de niveles específicos en un índice múltiple.
Ejemplo
print(df.xs(1, level='Number'))
Salida:
Value
Letter
A 10
B 30
2. Segmentación de índices múltiples
Pandas admite operaciones de corte en el índice múltiple, permitiendo seleccionar diferentes subconjuntos mediante niveles de índice.
Ejemplo
print(df.loc['A'])
Salida:
Value Number 1 10 2 20
3. Ordenar índices múltiples
El métodosort_index()de Pandas permite ordenar el índice múltiple.
Ejemplo
df_sorted = df.sort_index(level=['Letter', 'Number'], ascending=[True, False])
print(df_sorted)
Salida:
Value
Letter Number
A 2 20
1 10
B 2 40
1 30
4. Operaciones de agregación
El índice múltiple combinado congroupby()puede realizar potentes operaciones de agregación, adecuado para el análisis estadístico de datos complejos.
Ejemplo
df_grouped = df.groupby(['Letter', 'Number']).sum()
print(df_grouped)
Salida:
Value
Letter Number
A 1 10
2 20
B 1 30
2 40
5. Restablecer el índice
Se puede usarreset_index()para restablecer el índice múltiple a columnas normales.
Ejemplo
df_reset = df.reset_index()
print(df_reset)
Salida:
Letter Number Value 0 A 1 10 1 A 2 20 2 B 1 30 3 B 2 40
6. Valores faltantes en índices múltiples
Los valores faltantes en el índice múltiple se pueden manejar mediantefillna()odropna()de manera similar a los índices normales.
Ejemplo
data = {
'Letter': ['A', 'A', 'B', 'B'],
'Number': [1, 2, 1, 2],
'Value': [10, None, 30, 40]
}
df = pd.DataFrame(data)
df.set_index(['Letter', 'Number'], inplace=True)
# Rellenar valores faltantes
df_filled = df.fillna(0)
print(df_filled)
Salida:
Value
Letter Number
A 1 10
2 0
B 1 30
2 40
Otras extensiones