Estoy tratando de agregar filas a un DataFrame interpolando valores en una columna por grupo, y completar con las demás columnas que faltan. Mis datos se ven algo como esto:
import pandas as pd import random random.seed(42) data = {'group':['a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c' ], 'value' : [1, 2, 5, 3, 4, 5, 7, 4, 7, 9], 'other': random.sample(range(1, 100), 10)} df = pd.DataFrame(data) print(df) group value other 0 a 1 82 1 a 2 15 2 a 5 4 3 b 3 95 4 b 4 36 5 b 5 32 6 b 7 29 7 c 4 18 8 c 7 14 9 c 9 87Lo que estoy tratando de lograr es algo como esto:
group value other a 1 82 a 2 15 a 3 NaN a 4 NaN a 5 NaN b 3 95 b 4 36 b 5 32 b 6 NaN b 7 29 c 4 18 c 5 NaN c 6 NaN c 7 14 c 8 NaN c 9 87 Por ejemplo, el grupo a tiene un rango de 1 a 5, b de 3 a 7 y c de 4 a 9.
El problema que tengo es que cada grupo tiene un rango diferente. Encontré algo que funciona asumiendo un solo rango para todos los grupos. Esto podría funcionar usando el mínimo y máximo global y eliminando filas adicionales en cada grupo, pero dado que mis datos son bastante grandes, agregar muchas filas por grupo rápidamente se vuelve inviable.
>>> df.groupby('group').apply(lambda x: x.set_index('value').reindex(np.arange(x['value'].min(), x['value'].max() + 1))).drop(columns='group').reset_index() group value other 0 a 1 82.0 1 a 2 15.0 2 a 3 NaN 3 a 4 NaN 4 a 5 4.0 5 b 3 95.0 6 b 4 36.0 7 b 5 32.0 8 b 6 NaN 9 b 7 29.0 10 c 4 18.0 11 c 5 NaN 12 c 6 NaN 13 c 7 14.0 14 c 8 NaN 15 c 9 87.0 Agrupamos en la columna del group y luego volvemos a indexar cada grupo con el rango desde el mínimo hasta el máximo de la columna de value
Una opción es con la función completa de pyjanitor , que puede ser útil para exponer filas que faltan explícitamente (y también puede ser útil para abstraer el proceso de remodelación):
# pip install pyjanitor import pandas as pd import janitor new_value = {'value' : lambda df: range(df.min(), df.max()+1)} # expose the missing values per group via the `by` parameter df.complete(new_value, by='group', sort = True) group value other 0 a 1 82.0 1 a 2 15.0 2 a 3 NaN 3 a 4 NaN 4 a 5 4.0 5 b 3 95.0 6 b 4 36.0 7 b 5 32.0 8 b 6 NaN 9 b 7 29.0 10 c 4 18.0 11 c 5 NaN 12 c 6 NaN 13 c 7 14.0 14 c 8 NaN 15 c 9 87.0