Python

Pandas: Seleccionar elementos aleatorios en DataFrames Pandas

Los objetos DataFrame de Pandas cuenta con el método sample() mediante el cual es posible seleccionar un subconjunto aleatorio de elementos. Algo que es de gran utilidad para realizar muestreo de datos. Veamos a continuación cómo se puede usar este método para seleccionar elementos aleatorios en DataFrames.

El método sample() de los DataFrames

La forma en la que se puede llamar al método sample() es:

df.sample(n=None, frac=None, replace=False, weights=None, random_state=None)

donde

  • n: es el número de elementos que se desean seleccionar del objeto.
  • frac: es la fracción de elementos que se desea obtener, no se puede emplear al mismo tiempo que n siendo únicamente posible usar uno de los dos.
  • replace: indica si el valor que se ha seleccionado se puede volver a incluir en la muestra o solamente se puede obtener una vez.
  • weights: permite asignar una probabilidad de ser seleccionado a cada uno de los registros, por defecto todos tienen la misma.

Ejemplo básico de uso del método sample()

Para evaluar el funcionamiento del método sample() es necesario crear primero disponer de un conjunto de datos. Algo que se puede hacer mediante el uso de generadores aleatorios.

import numpy as np
import pandas as pd

np.random.seed(1)

df = pd.DataFrame(np.random.randint(0, 100,
                                    size=(6, 4)),
                  columns=list('ABCD'))
    A   B   C   D
0  37  12  72   9
1  75   5  79  64
2  16   1  76  71
3   6  25  50  20
4  18  84  11  28
5  29  14  50  68

Una vez creado el conjunto de datos se puede ver qué pasa cuando se llama a este método.

df.sample()
    A   B   C   D
4  18  84  11  28

Devuelve un único registro seleccionado de forma aleatoria. Por lo que, en caso de que sea necesario extraer más de un valor, es necesario indicar estos mediante el uso de la propiedad n. Así, para obtener dos solamente se tiene que escribir.

df.sample(n = 2)
    A   B   C   D
2  16   1  76  71
0  37  12  72   9

Otra alternativa es indicar el porcentaje de registros que se desean seleccionar. Valor que se debe indicar mediante el parámetro frac, el cual no se puede llamar al mismo tiempo que n ya que provoca un error. De este modo se puede obtener el 50% de los valores mediante usando la siguiente línea de código

df.sample(frac = 0.5)
    A   B   C   D
2  16   1  76  71
4  18  84  11  28
3   6  25  50  20

Seleccionar múltiples veces un mismo valor

Por defecto el método sample() no incluirá dos veces un mismo registro, por lo que los valores de frac han de estar acotados entre 0 y 1. Aunque este comportamiento se puede modificar mediante la propiedad replace. Asignando el valor verdadero a esta propiedad después de seleccionar una regimos este puede ser seleccionado a continuación, es decir, el muestreo será con reposición. Algo que se puede comprobar en el siguiente ejemplo.

df.sample(frac = 1, replace=True)
    A   B   C   D
0  37  12  72   9
0  37  12  72   9
5  29  14  50  68
3   6  25  50  20
2  16   1  76  71
1  75   5  79  64

En donde se puede ver que la fila 0 se ha incluido dos veces.

Cambiar la probabilidad de seleccionar un valor

Otra propiedad interesante del método es weights, con la que se le puede asignar una probabilidad diferente a cada uno de los valores. Lo que se puede asignar el nombre de una columna a esta propiedad.

Por defecto la probabilidad de seleccionar cada uno de los valores es la misma para todos. Algo que se puede verificar seleccionado 1000 muestras y comprobado que todos los valores aparecen aproximadamente la cantidad de veces, para lo que nos podemos ayudar del método value_counts.

df.sample(frac = 1000, replace=True)['B'].value_counts(normalize=True)
14    0.174167
1     0.173333
25    0.167333
84    0.163500
12    0.163500
5     0.158167

Obteniendo que en todos los casos valores próximos a 1/6. Por otro lado, en caso de asignar un peso diferente a cada una de las columnas esto ya no es así.

df.sample(frac = 1000, replace=True, weights='B')['B'].value_counts(normalize=True)
84    0.599500
25    0.172167
14    0.101333
12    0.084500
5     0.035667
1     0.006833

Observando que el valor 84 aparece un 59% de las veces, lo que se corresponde con 84/141 (141 es la suma de los valores de la columna B), y 1 aparece un 0,8%, un valor muy próximo al que se esperaría 1/141.

Conclusiones

En esta ocasión se ha visto algunas de las posibilidades que ofrece el método sample() para seleccionar elementos aleatorios en DataFrames de Pandas. Un método con el que se puede automatizar los procesos de muestreo, por lo que es aconsejable tenerlo entre nuestros recursos habituales.

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez
Tags: Pandas

Recent Posts

La Paradoja del Cumpleaños, o por qué no es tan raro compartir fecha de nacimiento

Imagínate en una sala con un grupo de personas, por ejemplo, en una oficina, un…

3 días ago

Programador de tareas de Windows: Guía definitiva para automatizar tu trabajo (BAT, PowerShell y Python)

En el trabajo diario con ordenadores, es común encontrarse con tareas repetitivas: realizar copias de…

5 días ago

Curiosidad: ¿Por qué usamos p < 0.05? Un umbral que cambió la historia de la ciencia

En casi cualquier análisis estadístico —ya sea en medicina, psicología, economía o ciencia de datos—…

1 semana ago

¿Está concentrado el MSCI World? Un análisis con Gini, Lorenz y leyes de potencia

El MSCI World Index suele presentarse como “la ventana al mundo” para quienes invierten en…

2 semanas ago

Curiosidad: La maldición de la dimensionalidad, o por qué añadir más datos puede empeorar tu modelo

En el mundo del análisis de datos solemos escuchar una idea poderosa: cuantos más datos,…

2 semanas ago

Error npm ERR! code EACCES al instalar paquetes en Node.js: Cómo solucionarlo paso a paso

¿Te has encontrado con este error al intentar instalar paquetes con npm? npm ERR! code…

3 semanas ago

This website uses cookies.