Encuentre estadísticas de percentiles de una columna dada

2 minutos de lectura

Avatar de usuario de Edamame
edamame

Tengo un marco de datos de pandas my_df, donde puedo encontrar la media (), la mediana (), el modo () de una columna dada:

my_df['field_A'].mean()
my_df['field_A'].median()
my_df['field_A'].mode()

Me pregunto si es posible encontrar estadísticas más detalladas, como el percentil 90. ¡Gracias!

avatar de usuario de stackoverflowuser2010
stackoverflowuser2010

  • Puedes usar el pandas.DataFrame.quantile() función.
    • Si miras la API para quantile(), verá que se necesita un argumento sobre cómo hacer la interpolación. Si desea un cuantil que se encuentre entre dos posiciones en sus datos:
      • ‘lineal’, ‘inferior’, ‘superior’, ‘punto medio’ o ‘más cercano’.
      • Por defecto, realiza una interpolación lineal.
      • Estos métodos de interpolación se discuten en el artículo de Wikipedia para percentil
import pandas as pd
import numpy as np

# sample data 
np.random.seed(2023)  # for reproducibility
data = {'Category': np.random.choice(['hot', 'cold'], size=(10,)),
        'field_A': np.random.randint(0, 100, size=(10,)),
        'field_B': np.random.randint(0, 100, size=(10,))}
df = pd.DataFrame(data)

df.field_A.mean()  # Same as df['field_A'].mean()
# 51.1

df.field_A.median() 
# 50.0

# You can call `quantile(i)` to get the i'th quantile,
# where `i` should be a fractional number.

df.field_A.quantile(0.1)  # 10th percentile
# 15.6

df.field_A.quantile(0.5)  # same as median
# 50.0

df.field_A.quantile(0.9)  # 90th percentile
# 88.8

df.groupby('Category').field_A.quantile(0.1)
#Category
#cold    28.8
#hot      8.6
#Name: field_A, dtype: float64

df

  Category  field_A  field_B
0     cold       96       58
1     cold       22       28
2      hot       17       81
3     cold       53       71
4     cold       47       63
5      hot       77       48
6     cold       39       32
7      hot       69       29
8      hot       88       49
9      hot        3       49

suponer serie s

s = pd.Series(np.arange(100))

Obtener cuantiles para [.1, .2, .3, .4, .5, .6, .7, .8, .9]

s.quantile(np.linspace(.1, 1, 9, 0))

0.1     9.9
0.2    19.8
0.3    29.7
0.4    39.6
0.5    49.5
0.6    59.4
0.7    69.3
0.8    79.2
0.9    89.1
dtype: float64

O

s.quantile(np.linspace(.1, 1, 9, 0), 'lower')

0.1     9
0.2    19
0.3    29
0.4    39
0.5    49
0.6    59
0.7    69
0.8    79
0.9    89
dtype: int32

Descubrí que a continuación funcionaría:

my_df.dropna().quantile([0.0, .9])

Incluso puede dar múltiples columnas con valores nulos y obtener múltiples valores de cuantiles (uso el percentil 95 para el tratamiento de valores atípicos)

my_df[['field_A','field_B']].dropna().quantile([0.0, .5, .90, .95])

una forma muy fácil y eficiente es llamar a la función describe en la columna en particular

df['field_A'].describe()

esto le dará la media, el máximo, la mediana y el percentil 75

avatar de usuario de mikelowry
mikelowry

Describe te dará cuartiles, si quieres percentiles, puedes hacer algo como

 df['YOUR_COLUMN_HERE'].describe(percentiles=[.1, .2, .3, .4, .5, .6 , .7, .8, .9, 1])

¿Ha sido útil esta solución?