Pandas: columna categórica e inserción de filas para cada categoría

1

Parece que no puedo lograr insertar filas con valores faltantes, mientras tengo una columna como categórica.

Suponga el siguiente marco de datos df, donde la columna B es categórica y las categorías deben aparecer en el orden de 'd', 'b', 'c', 'a'.

df= pd.DataFrame({'A':['i', 'i', 'i', 'j', 'k'], \
                  'B':pd.Categorical(['d', 'c', 'b','b', 'a'], \
                                     categories= ['d', 'b', 'c', 'a'], \
                                     ordered=True), \
                  'C':[1, 0, 3 ,2, np.nan]})

Necesito convertir df al siguiente formato:

   A  B    C
 0  i  d  1.0
 1  i  b  0.0
 2  i  c  3.0
 3  i  a  NaN
 4  j  d  NaN
 5  j  b  2.0
 6  j  c  NaN
 7  j  a  NaN
 8  k  d  NaN
 9  k  b  NaN
10  k  c  NaN
11  k  a  NaN

¡Gracias de antemano!

0

Puede establecer el índice del marco de datos en la columna B, de esta manera podemos usar el reindexmás adelante para completar los valores categóricos que faltan para cada grupo. Use la groupbycolumna Ay seleccione la columna C, luego aplique la reindexfunción como se mencionó anteriormente, usando ahora la secuencia de categoría deseada. Luego, use reset_indexpara insertar los índices ( Ay B) nuevamente en las columnas del marco de datos.

import pandas as pd
import numpy as np

df = pd.DataFrame({'A':['i', 'i', 'i', 'j', 'k'], \
                  'B':pd.Categorical(['d', 'c', 'b','b', 'a'], \
                                     categories= ['d', 'b', 'c', 'a'], \
                                     ordered=True), \
                  'C':[1, 0, 3 ,2, np.nan]})
print(df)

df = df.set_index('B')
df = df.groupby('A')['C']\
        .apply(lambda x: x.reindex(['d', 'b', 'c', 'a']))\
        .reset_index()

df.B = pd.Categorical(df.B)
print(df)

Salida de df

    A  B    C
0   i  d  1.0
1   i  b  3.0
2   i  c  0.0
3   i  a  NaN
4   j  d  NaN
5   j  b  2.0
6   j  c  NaN
7   j  a  NaN
8   k  d  NaN
9   k  b  NaN
10  k  c  NaN
11  k  a  NaN
1
  • Muchas gracias por tu respuesta. ¡Volveré a mi conjunto de datos original para probar esto! 17 de febrero a las 11:04