résultat de groupby pandas utilisant différentes combinaisons de tableaux booléens comme clés

Aug 19 2020

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

RichieV Aug 20 2020 at 04:23

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

  1. b=a.groupby([False,False]): les deux lignes appartiennent au même groupe (group_id False), et sont analysées ensemble une fois pour former le même df

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

  3. d=a.groupby([False,True]): identique au n ° 2 mais maintenant la première ligne appartient au groupe False. Si vous agrégiez ou appliquez une fonction différente (autre que pandas.DataFrame), vous verriez le df avec True, Falsecomme index (trie groupby par défaut) et la ligne 1 apparaîtra comme première ligne, car elle appartient au groupeTrue

1 AkshaySehgal Aug 20 2020 at 04:14

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.