Pandas: diferencia entre el valor más grande y el más pequeño dentro del grupo

Dado un dataframe que se parece a esto

GROUP VALUE 1 5 2 2 1 10 2 20 1 7 

Me gustaría calcular la diferencia entre el valor más grande y el más pequeño dentro de cada grupo. Es decir, el resultado debe ser.

 GROUP DIFF 1 5 2 18 

¿Cuál es una manera fácil de hacer esto en Pandas?

¿Cuál es una forma rápida de hacer esto en Pandas para un dataframe con aproximadamente 2 millones de filas y 1 millón de grupos?

Usando el df @unutbu

por tiempo
La solución de Unutbu es mejor sobre grandes conjuntos de datos.

 import pandas as pd import numpy as np df = pd.DataFrame({'GROUP': [1, 2, 1, 2, 1], 'VALUE': [5, 2, 10, 20, 7]}) df.groupby('GROUP')['VALUE'].agg(np.ptp) GROUP 1 5 2 18 Name: VALUE, dtype: int64 

np.ptp docs devuelve el rango de una matriz


sincronización
pequeña df

introduzca la descripción de la imagen aquí

df grande
df = pd.DataFrame(dict(GROUP=np.arange(1000000) % 100, VALUE=np.random.rand(1000000)))

introduzca la descripción de la imagen aquí

df grande
muchos grupos
df = pd.DataFrame(dict(GROUP=np.arange(1000000) % 10000, VALUE=np.random.rand(1000000)))

introduzca la descripción de la imagen aquí

groupby/agg generalmente se desempeña mejor cuando se aprovechan de los agregadores integrados, como 'max' y 'min' . Entonces, para obtener la diferencia, primero calcula el max y el min y luego resta:

 import pandas as pd df = pd.DataFrame({'GROUP': [1, 2, 1, 2, 1], 'VALUE': [5, 2, 10, 20, 7]}) result = df.groupby('GROUP')['VALUE'].agg(['max','min']) result['diff'] = result['max']-result['min'] print(result[['diff']]) 

rendimientos

  diff GROUP 1 5 2 18 

Puede usar groupby() , min() y max() :

 df.groupby('GROUP')['VALUE'].apply(lambda g: g.max() - g.min())