I risultati dei gruppi di panda utilizzano diverse combinazioni di array booleani come chiavi

Aug 19 2020

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

RichieV Aug 20 2020 at 04:23

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

  1. b=a.groupby([False,False]): entrambe le righe appartengono allo stesso gruppo (group_id False) e vengono analizzate insieme una volta per formare lo stesso df

  2. c=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'originale

  3. d=a.groupby([False,True]): uguale a # 2 ma ora la prima riga appartiene al gruppo False. Se aggreghi o applichi una funzione diversa (diversa da pandas.DataFrame) vedresti il ​​df con True, Falsecome indice (groupby ordina per impostazione predefinita) e la riga 1 apparirà come prima riga, perché appartiene al gruppoTrue

1 AkshaySehgal Aug 20 2020 at 04:14

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.