Cómo crear nuevos valores en una columna de dataframe de pandas basado en valores de otra columna

Tengo un dataframe de pandas de valores que leí en un archivo csv. Tengo una columna con la etiqueta “SleepQuality” y los valores flotan de 0.0 a 100.0. Quiero crear una nueva columna con la etiqueta ‘SleepQualityGroup’ donde los valores de la columna original entre 0 y 49 tienen un valor de 0 en la nueva columna, 50 – 59 = 1, 60 – 69 = 2, 70 – 79 = 3, 80 – 89 = 4, y 90 – 100 = 5

¿Cuál sería la mejor fórmula para usar para hacer esto? Estoy atascado en la lógica necesaria para identificar todos los valores en cada rango y asignarlos al nuevo valor.

Un ejemplo de cómo le gustaría la salida a continuación en la nueva columna ‘SleepQualityGroup’.

SleepQuality SleepQualityGroup 80.4 4 90.1 5 66.4 2 50.3 1 86.2 4 75.4 3 45.7 0 91.5 5 61.3 2 54 1 58.2 1 

Usa pd.cut ie

 df['new'] = pd.cut(df['SleepQuality'],bins=[0,50 , 60, 70 , 80 , 90,100], labels=[0,1,2,3,4,5]) 

Salida:

         SleepQuality SleepQualityGroup nuevo
 0 80.4 4 4
 1 90.1 5 5
 2 66.4 2 2
 3 50.3 1 1
 4 86.2 4 4
 5 75.4 3 3
 6 45.7 0 0
 7 91.5 5 5
 8 61.3 2 2
 9 54.0 1 1
 10 58.2 1 1

Eso es básicamente una operación binning. Como tales dos herramientas podrían ser utilizadas aquí.

Utilizando np.searchsorted

 bins = np.arange(50,100,10) df['SleepQualityGroup'] = bins.searchsorted(df.SleepQuality) 

Utilizando np.digitize

 df['SleepQualityGroup'] = np.digitize(df.SleepQuality, bins) 

Salida de muestra –

 In [866]: df Out[866]: SleepQuality SleepQualityGroup 0 80.4 4 1 90.1 5 2 66.4 2 3 50.3 1 4 86.2 4 5 75.4 3 6 45.7 0 7 91.5 5 8 61.3 2 9 54.0 1 10 58.2 1 

Prueba de tiempo de ejecución –

 In [921]: df Out[921]: SleepQuality SleepQualityGroup 0 80.4 4 1 90.1 5 2 66.4 2 3 50.3 1 4 86.2 4 5 75.4 3 6 45.7 0 7 91.5 5 8 61.3 2 9 54.0 1 10 58.2 1 In [922]: df = pd.concat([df]*10000,axis=0) # @Dark's soln using pd.cut In [923]: %timeit df['new'] = pd.cut(df['SleepQuality'],bins=[0,50 , 60, 70 , 80 , 90,100], labels=[0,1,2,3,4,5]) 1000 loops, best of 3: 1.04 ms per loop In [926]: %timeit df['SleepQualityGroup'] = bins.searchsorted(df.SleepQuality) 1000 loops, best of 3: 591 µs per loop In [927]: %timeit df['SleepQualityGroup'] = np.digitize(df.SleepQuality, bins) 1000 loops, best of 3: 538 µs per loop