Hoe wijs ik een naam toe aan de kolom size()?

Ik gebruik .size()voor een groupby-resultaat om te tellen hoeveel items er in elke groep zitten.

Ik wil dat het resultaat wordt opgeslagen onder een nieuwe kolomnaam zonder handmatig de kolomnamenmatrix te bewerken, hoe kan ik dat doen?

Dit is wat ik heb geprobeerd:

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

en de fout die ik kreeg:

TypeError: ‘DataFrameGroupBy’-object ondersteunt geen itemtoewijzing
(op de tweede regel)


Antwoord 1, autoriteit 100%

De ingebouwde methode .size()van DataFrameGroupBy-objecten retourneert in feite een Series-object met de groepsgroottes en niet een DataFrame. Als u een DataFrame wilt waarvan de kolom de groepsgrootte is, geïndexeerd door de groepen, met een aangepaste naam, kunt u de methode .to_frame()gebruiken en de gewenste kolomnaam als argument gebruiken.

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

Als u wilt dat de groepen weer kolommen zijn, kunt u aan het einde een .reset_index()toevoegen.


Antwoord 2, autoriteit 51%

Je moet transformsizelenvan dfis hetzelfde als voorheen:

Opmerking:

Hier is het nodig om één kolom toe te voegen na groupby, anders krijg je een foutmelding. Omdat GroupBy.sizetelt ook NaNs, welke kolom wordt gebruikt is niet belangrijk. Alle kolommen werken hetzelfde.

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

Stel zo nodig de kolomnaam in bij het samenvoegen van dflenvan dfis duidelijk NIEThetzelfde als voorheen:

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

Antwoord 3, autoriteit 43%

Het resultaat van df.groupby(...)is geen DataFrame. Om een ​​DataFrame terug te krijgen, moet je een functie toepassen op elke groep, elk element van een groep transformeren of de groepen filteren.

Het lijkt erop dat je een DataFrame wilt dat (1) al je originele gegevens in dfbevat en (2) het aantal gegevens in elke groep. Deze dingen hebben verschillende lengtes, dus als ze in hetzelfde DataFrame moeten worden geplaatst, moet je de grootte redundant vermelden, d.w.z. voor elke rij in elke groep.

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

(Terzijde: het is handig als u beknopte voorbeeldinvoer en verwachte resultaten kunt laten zien.)


Antwoord 4, autoriteit 3%

U kunt de parameter as_indexin groupbyinstellen op Falseom een ​​DataFrame te krijgen in plaats van een Series:

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

Uitvoer:

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

Other episodes