I risultati dei gruppi di panda utilizzano diverse combinazioni di array booleani come chiavi
Ho provato a capire il gruppo usando l'array booleano come chiave, ecco il codice di prova,
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
Quindi ho provato una combinazione diversa di array booleano, che sembra che il risultato di groupby sia lo stesso 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
Risposte
Analizziamolo
.groubpy().apply(pd.DataFrame)
come si usa in tutte le varianti prende le righe da ogni gruppo e crea un dataframe, che sostanzialmente ritorna self
, quindi l'output sembra lo stesso, ma il modo in cui i panda ci arrivano è diverso in ogni caso
b=a.groupby([False,False])
: entrambe le righe appartengono allo stesso gruppo (group_idFalse
) e vengono analizzate insieme una volta per formare lo stesso dfc=a.groupby([True,False])
: ci sono due gruppi con una riga ciascuno. Applica prende ogni gruppo e crea due DataFrame separati (uno per gruppo). Quindi concatena e restituisce un df identico all'originaled=a.groupby([False,True])
: uguale a # 2 ma ora la prima riga appartiene al gruppoFalse
. Se aggreghi o applichi una funzione diversa (diversa da pandas.DataFrame) vedresti il df conTrue, False
come indice (groupby ordina per impostazione predefinita) e la riga 1 apparirà come prima riga, perché appartiene al gruppoTrue
Questo perché il parametro di raggruppamento che stai passando non è in grado di suddividere il dataframe nelle parti richieste. Quindi copia semplicemente l'intero dataframe e lo "zippa" nell'array di raggruppamento che stai passando. Un esempio -
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)
Si noti che con l'array di raggruppamento [False, True], è semplicemente zippare l'intero dataframe a con ciascuno. Se invece avessi passato qualcosa che potrebbe trovare nell'asse 1, prenderebbe in considerazione gli elementi di quella serie per raggruppare il dataset.
Un altro modo per vederlo è che il parametro di raggruppamento deve essere una serie con un nome e questo nome dovrebbe essere trovato nelle colonne del frame di dati. Se passi un array [True, False], è fondamentalmente interpretato come una serie senza nome e quindi non è in grado di ottenere le sue chiavi per eseguire la divisione.
Una buona immagine da seguire è la seguente se vuoi capire come funziona groupby:

La divisione avviene sulla chiave fornita e la chiave deve essere referenziata nell'indice / colonne, altrimenti non può essere divisa e restituisce semplicemente un dataframe non diviso con ciascun gruppo. Questo primo passaggio è ciò che fa la cernia, il successivo è l'applicazione e la combinazione di passaggi che sono semplici. Nelle tuple che vedete sopra (output stampato), la funzione apply opera t[1]
sull'elemento di ogni tupla, dopodiché lo combina con l' t[0]
elemento di ogni tupla e concatena verticalmente.