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 transform
size
– len
van df
is hetzelfde als voorheen:
Opmerking:
Hier is het nodig om één kolom toe te voegen na groupby
, anders krijg je een foutmelding. Omdat GroupBy.size
telt ook NaN
s, 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 df
– len
van df
is 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 df
bevat 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_index
in groupby
instellen op False
om 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