pandas groupby resultado usando diferentes combinaciones de matriz booleana como claves
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
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
b=a.groupby([False,False])
: ambas filas pertenecen al mismo grupo (group_idFalse
) y se analizan juntas una vez para formar el mismo dfc=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 originald=a.groupby([False,True])
: igual que el n. ° 2 pero ahora la primera fila pertenece al grupoFalse
. Si agrega o aplica una función diferente (que no sea pandas.DataFrame), verá el df conTrue, False
como índice (groupby ordena por defecto) y la fila 1 aparecería como la primera fila, porque pertenece al grupoTrue
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.