pandas groupby resultado usando diferentes combinaciones de matriz booleana como claves

Aug 19 2020

Traté de entender el grupo usando una matriz booleana como clave, aquí está el código de prueba,

a = pd.DataFrame([[True,False,False],[False,True,False]], columns=['A','B','C'])
print(a)

     A      B      C
0   True  False  False
1  False   True  False

Luego probé una combinación diferente de matriz booleana, que parece que el resultado de groupby es el mismo r

b=a.groupby([False,False])
b.apply(pd.DataFrame)

       A     B       C
0   True    False   False
1   False   True    False

c=a.groupby([True,False])
c.apply(pd.DataFrame)

      A      B       C
0   True    False   False
1   False   True    False

d=a.groupby([False,True])
d.apply(pd.DataFrame)

     A       B       C
0   True    False   False
1   False   True    False

e=a.groupby([False,True])
e.apply(pd.DataFrame)

     A       B       C
0   True    False   False
1   False   True    False

Respuestas

RichieV Aug 20 2020 at 04:23

Vamos a romperlo

.groubpy().apply(pd.DataFrame)como se usa en todas las variantes, toma las filas de cada grupo y crea un marco de datos, que básicamente regresa self, por lo que la salida se ve igual, pero la forma en que los pandas llegan allí es diferente en cada caso

  1. b=a.groupby([False,False]): ambas filas pertenecen al mismo grupo (group_id False) y se analizan juntas una vez para formar el mismo df

  2. c=a.groupby([True,False]): hay dos grupos con una fila cada uno. Apply toma cada grupo y crea dos DataFrames separados (uno por grupo). Luego concatena y devuelve un gl idéntico al original

  3. d=a.groupby([False,True]): igual que el n. ° 2 pero ahora la primera fila pertenece al grupo False. Si agrega o aplica una función diferente (que no sea pandas.DataFrame), verá el df con True, Falsecomo índice (groupby ordena por defecto) y la fila 1 aparecería como la primera fila, porque pertenece al grupoTrue

1 AkshaySehgal Aug 20 2020 at 04:14

Esto se debe a que el parámetro de agrupación que está pasando no puede dividir el marco de datos en las partes requeridas. Así que simplemente copia todo el marco de datos y lo 'comprime' en la matriz de agrupación que está pasando. Un ejemplo -

a = pd.DataFrame([[True,False,False],[False,True,False]], columns=['A','B','C'])

c = a.groupby([True,False])

print('length of grouper object:',len(c))
print(' ')
print(list(c)[0])
print(' ')
print(list(c)[1])
length of grouper object: 2
 
(False,        A     B      C
1  False  True  False)
 
(True,       A      B      C
0  True  False  False)

Observe que con la matriz de agrupación [False, True], simplemente se comprime todo el marco de datos a con cada uno. Si, en cambio, hubiera pasado algo que pudiera encontrar en el eje 1, consideraría los elementos de esa serie para agrupar el conjunto de datos.

Otra forma de verlo es que el parámetro de agrupación debe ser una serie con un nombre y este nombre debe encontrarse en las columnas del marco de datos. Si pasa una matriz [Verdadero, Falso], básicamente se interpreta como una serie sin nombre y, por lo tanto, no puede obtener sus claves para realizar la división.

Una buena imagen a seguir es la siguiente si desea comprender cómo funciona groupby:

La división ocurre en la clave proporcionada, y la clave debe ser referenciable en el índice / columnas; de lo contrario, no se puede dividir y simplemente devuelve un marco de datos sin dividir con cada grupo. Este primer paso es lo que hace el agrupador, el siguiente es aplicar y combinar pasos que son sencillos. En las tuplas que ve arriba (salida impresa), la función de aplicación opera en el t[1]elemento de cada tupla, después de lo cual lo combina con el t[0]elemento de cada tupla y concatena verticalmente.