résultat de groupby pandas utilisant différentes combinaisons de tableaux booléens comme clés
J'ai essayé de comprendre le group en utilisant un tableau booléen comme clé, voici le code de test,
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
Ensuite, j'ai essayé différentes combinaisons de tableau booléen, ce qui semble que le résultat groupby est le même 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
Réponses
Décomposons-le
.groubpy().apply(pd.DataFrame)
comme vous l'utilisez dans toutes les variantes, prend les lignes de chaque groupe et crée un dataframe, qui retourne fondamentalement self
, donc la sortie a la même apparence, mais la façon dont les pandas y arrivent est différente dans tous les cas
b=a.groupby([False,False])
: les deux lignes appartiennent au même groupe (group_idFalse
), et sont analysées ensemble une fois pour former le même dfc=a.groupby([True,False])
: il y a deux groupes avec une ligne chacun. Apply prend chaque groupe et crée deux DataFrames séparés (un par groupe). Puis concatène et renvoie un df identique à l'originald=a.groupby([False,True])
: identique au n ° 2 mais maintenant la première ligne appartient au groupeFalse
. Si vous agrégiez ou appliquez une fonction différente (autre que pandas.DataFrame), vous verriez le df avecTrue, False
comme index (trie groupby par défaut) et la ligne 1 apparaîtra comme première ligne, car elle appartient au groupeTrue
En effet, le paramètre de regroupement que vous transmettez n'est pas en mesure de découper la trame de données dans les parties requises. Ainsi, il copie simplement le dataframe entier et le «zippe» dans le tableau de regroupement que vous passez. Un exemple -
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)
Notez qu'avec le tableau de regroupement [False, True], il suffit de compresser la totalité du dataframe a avec chacun. Si vous aviez plutôt passé quelque chose qu'il pouvait trouver dans l'axe 1, il prendrait en compte les éléments de cette série pour regrouper l'ensemble de données.
Une autre façon de voir les choses est que le paramètre de regroupement doit être une série avec un nom et ce nom doit être trouvé dans les colonnes du bloc de données. Si vous passez un tableau [True, False], il est essentiellement interprété comme une série sans nom et ne peut donc pas obtenir ses clés pour effectuer le fractionnement.
Une bonne image à suivre est la suivante si vous voulez comprendre le fonctionnement de groupby -

Le fractionnement se produit sur la clé fournie et la clé doit être référençable dans l'index / les colonnes, sinon elle ne peut pas être fractionnée et renvoie simplement une trame de données non fractionnée avec chaque groupe. Cette première étape est ce que fait le mérou, ensuite les étapes d'application et de combinaison qui sont simples. Dans les tuples que vous voyez ci-dessus (sortie imprimée), la fonction apply opère sur l' t[1]
élément de chaque tuple, après quoi elle le combine avec l' t[0]
élément de chaque tuple et concatène verticalement.