Estoy tratando de averiguar cómo contar cuidadosamente la cantidad de valores en una columna de marco de datos que se encuentran en múltiples rangos personalizados. Me doy cuenta de que el agrupamiento es la técnica común para esto, pero no estoy seguro de que sea lo que estoy buscando aquí.
Digamos que tengo el siguiente marco de datos:
Date Value1 Value2 --------------------------------------- 0 4/15/2018 4 4 1 4/16/2018 4 3 2 4/17/2018 2 7 3 4/18/2018 4 3 4 4/19/2018 3 8 5 4/20/2018 9 4 6 4/21/2018 9 6 7 4/22/2018 8 3 8 4/23/2018 9 5 9 4/24/2018 9 5 10 4/25/2018 10 5 11 4/26/2018 15 2 12 4/27/2018 18 2 13 4/28/2018 17 3 14 4/29/2018 6 4 ...Ahora, tengo tres rangos personalizados (todo incluido): 1 - 4, 7 - 10 y 13 - 20.
Quiero saber cuántos valores (o filas) de "Valor1" se encuentran dentro de cada uno de estos rangos. Si bien sé que el agrupamiento se puede usar como bins = [0,4,7,13,20] , esto no logra lo que estoy buscando, ya que intenta colocar/dividir cada valor en la columna en un contenedor. Solo quiero encontrar la cantidad de valores (filas) que se encuentran en mis rangos. Esto significa que no me importan los valores de 5, 6, 11, 12, 21, 22, 23, etc. Para comprender los resultados, necesitaría asignar etiquetas a mis rangos para que 1 - 4 esté etiquetado como "Rango 1", 7 - 10 está etiquetado como "Rango 2", y 13 - 20 está etiquetado como "Rango 3".
Y entonces estoy tratando de producir el siguiente marco de datos de salida:
Date Value1 Value2 Range --------------------------------------------------- 0 4/15/2018 4 4 Range 1 1 4/16/2018 4 3 Range 1 2 4/17/2018 2 7 Range 1 3 4/18/2018 4 3 Range 1 4 4/19/2018 3 8 Range 1 5 4/20/2018 9 4 Range 2 6 4/21/2018 9 6 Range 2 7 4/22/2018 8 3 Range 2 8 4/23/2018 9 5 Range 2 9 4/24/2018 9 5 Range 2 10 4/25/2018 10 5 Range 2 11 4/26/2018 15 2 Range 3 12 4/27/2018 18 2 Range 3 13 4/28/2018 17 3 Range 3 14 4/29/2018 6 4 No_rangepara que pueda producir el siguiente marco de datos de resumen:
Range Frequency ---------------------------- 0 Range 1 5 1 Range 2 6 2 Range 3 3¿Cómo podría lograrse esto en python?
Series.between (que incluye ambos extremos por defecto)Range usando np.select ranges = { 'Range 1': df['Value1'].between(1, 4), 'Range 2': df['Value1'].between(7, 10), 'Range 3': df['Value1'].between(13, 20), } df['Range'] = np.select(ranges.values(), ranges.keys(), default='No range') # Date Value1 Value2 Range # 0 4/15/2018 4 4 Range 1 # 1 4/16/2018 4 3 Range 1 # 2 4/17/2018 2 7 Range 1 # 3 4/18/2018 4 3 Range 1 # 4 4/19/2018 3 8 Range 1 # 5 4/20/2018 9 4 Range 2 # 6 4/21/2018 9 6 Range 2 # 7 4/22/2018 8 3 Range 2 # 8 4/23/2018 9 5 Range 2 # 9 4/24/2018 9 5 Range 2 # 10 4/25/2018 10 5 Range 2 # 11 4/26/2018 15 2 Range 3 # 12 4/27/2018 18 2 Range 3 # 13 4/28/2018 17 3 Range 3 # 14 4/29/2018 6 4 No rangeUsar:
bins = pd.IntervalIndex.from_tuples([(1, 4), (7, 10), (13, 20)], closed="both") lookup = {val: label for val, label in zip(bins.values, [f"Range {i}" for i in range(1, 4)])} res = pd.cut(df["Value1"], bins=bins).cat.rename_categories(lookup).astype("string").fillna("No Range") print(res)Producción
0 Range 1 1 Range 1 2 Range 1 3 Range 1 4 Range 1 5 Range 2 6 Range 2 7 Range 2 8 Range 2 9 Range 2 10 Range 2 11 Range 3 12 Range 3 13 Range 3 14 No Range Name: Value1, dtype: string