90 votes

Comment attribuer un nom à la colonne size() ?

J'utilise .size() sur un résultat groupby afin de compter le nombre d'éléments dans chaque groupe.

Je voudrais que le résultat soit enregistré dans un nouveau nom de colonne sans modifier manuellement le tableau des noms de colonnes, comment faire ?

C'est ce que j'ai essayé :

grpd = df.groupby(['A','B'])
grpd['size'] = grpd.size()
grpd

et l'erreur que j'ai obtenue :

TypeError : L'objet 'DataFrameGroupBy' ne prend pas en charge l'affectation d'éléments. (sur la deuxième ligne)

103voto

Sealander Points 2439

En .size() La méthode intégrée des objets DataFrameGroupBy renvoie en fait un objet Series avec les tailles de groupe et non un DataFrame. Si vous voulez un DataFrame dont la colonne est constituée des tailles de groupe, indexée par les groupes, avec un nom personnalisé, vous pouvez utiliser la fonction .to_frame() et utiliser le nom de la colonne souhaitée comme argument.

grpd = df.groupby(['A','B']).size().to_frame('size')

Si vous vouliez que les groupes soient à nouveau des colonnes, vous pourriez ajouter une balise .reset_index() à la fin.

51voto

jezrael Points 290608

Vous devez transform size - len de df est la même que précédemment :

Avis :

Ici, il est nécessaire d'ajouter une colonne après groupby sinon vous obtenez une erreur. Parce que GroupBy.size compter NaN aussi, la colonne utilisée n'est pas importante. Toutes les colonnes fonctionnent de la même manière.

import pandas as pd

df = pd.DataFrame({'A': ['x', 'x', 'x','y','y']
                , 'B': ['a', 'c', 'c','b','b']})
print (df)
   A  B
0  x  a
1  x  c
2  x  c
3  y  b
4  y  b

df['size'] = df.groupby(['A', 'B'])['A'].transform('size')
print (df)
   A  B  size
0  x  a     1
1  x  c     2
2  x  c     2
3  y  b     2
4  y  b     2

Si vous avez besoin de définir le nom de la colonne dans l'agrégation df - len de df est évidemment PAS comme avant :

import pandas as pd

df = pd.DataFrame({'A': ['x', 'x', 'x','y','y']
                , 'B': ['a', 'c', 'c','b','b']})
print (df)
   A  B
0  x  a
1  x  c
2  x  c
3  y  b
4  y  b

df = df.groupby(['A', 'B']).size().reset_index(name='Size')
print (df)
   A  B  Size
0  x  a     1
1  x  c     2
2  y  b     2

42voto

Dan Allan Points 6172

Le résultat de df.groupby(...) n'est pas un DataFrame. Pour récupérer un DataFrame, vous devez appliquer une fonction à chaque groupe, transformer chaque élément d'un groupe ou filtrer les groupes.

Il semble que vous vouliez un DataFrame qui contient (1) toutes vos données d'origine en df et (2) le nombre de données contenues dans chaque groupe. Ces éléments ont des longueurs différentes, donc s'ils doivent être placés dans le même DataFrame, vous devrez lister la taille de manière redondante, c'est-à-dire pour chaque ligne de chaque groupe.

df['size'] = df.groupby(['A','B']).transform(np.size)

(A propos : il est utile que vous puissiez montrer un exemple succinct de saisie et de résultats attendus).

3voto

Mykola Zotko Points 1929

Vous pouvez définir le as_index dans groupby a False pour obtenir un DataFrame au lieu d'une série :

df = pd.DataFrame({'A': ['a', 'a', 'b', 'b'], 'B': [1, 2, 2, 2]})

df.groupby(['A', 'B'], as_index=False).size()

Sortie :

   A  B  size
0  a  1     1
1  a  2     1
2  b  2     2

0voto

Disons que n est le nom du cadre de données et cst est le nombre d'éléments répétés. Le code ci-dessous donne le compte dans la colonne suivante

cstn=Counter(n.cst)
cstlist = pd.DataFrame.from_dict(cstn, orient='index').reset_index()
cstlist.columns=['name','cnt']
n['cnt']=n['cst'].map(cstlist.loc[:, ['name','cnt']].set_index('name').iloc[:,0].to_dict())

J'espère que cela fonctionnera

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X