2016-09-03 3 views
3

Der HintergrundGROUPBY/Sum in Python Pandas - Null zählt nicht angezeigt ... manchmal

Ich habe einen Datensatz einer simuliert Bevölkerung von Menschen. Sie haben die folgenden Attribute

  1. Alter (0-120 Jahre)
  2. Geschlecht (männlich, weiblich)
  3. Rennen (weiß, schwarz, spanisch, asiatisch, andere)

df. Kopf()

Age Race Gender in_population 
0 32  0  0    1 
1 53  0  0    1 
2 49  0  1    1 
3 12  0  0    1 
4 28  0  0    1 

Es ist eine andere Variable, die die einzelnen als "In_Population" *, die eine Boolesche Variable identifiziert ist. Ich benutze groupby in Pandas, um die Population die möglichen Kombinationen der 3 Attribute zu gruppieren, um eine Zählertabelle zu berechnen, indem die Variable "In_Population" in jeder möglichen Kategorie von Personen summiert wird.

Es gibt 2 Geschlechter * 5 Rassen * 121 Alter = 1210 insgesamt möglichen Gruppen, die jedes Individuum in der Bevölkerung fallen wird.

Wenn eine bestimmte Gruppe von Personen in einem bestimmten Jahr keine Mitglieder hat (zB 0 Jahre alt männlich 'andere'), möchte ich immer noch, dass diese Gruppe in meiner Gruppe von Daten, aber mit einer Null in der Anzahl. Dies geschieht korrekt im folgenden Datenbeispiel (Alter = 0, Geschlecht = {0,1} und Rasse = 4). Es gab keine ‚anderen‘ Null-Jährigen in diesem speziellen

grouped_obj = df.groupby(['Age','Gender','Race']) 
groupedAGR = grouped_obj.sum() 
groupedAGR.head(10) 

       in_population 
Age Gender Race    
0 0  0    16 
      1     8 
      2    63 
      3     5 
      4     0 
    1  0    22 
      1     4 
      2    64 
      3    12 
      4     0 

Die Ausgabe

Dies ist nur für einige der Kombinationen Alter-Geschlecht-Rennen passiert. Manchmal werden die Nullsummengruppen vollständig übersprungen. Das Folgende sind die Daten für das 45. Lebensjahr. Ich hatte erwartet, 0 zu sehen, was darauf hindeutet, dass es in diesem Datensatz keine 45-jährigen männlichen "anderen" Rassen gibt.

>>> groupedAGR.xs(45, level = 'Age') 
      in_population 
Gender Race    
0  0    515 
     1    68 
     2    40 
     3    20 
1  0    522 
     1    83 
     2    48 
     3    29 
     4     3 

Hinweise

* „In_Population“ Grundsätzlich filtert „Neugeborene“ und „Einwanderer“, die nicht Teil der jeweiligen Bevölkerung als „Sterblichkeit“ zu berechnen; Die Todesfälle in der Bevölkerung passieren, bevor Einwanderung und Geburten passieren, also schließe ich sie von den Berechnungen aus. Ich hatte den Verdacht, dass dies etwas damit zu tun hatte - die Nulljährigen zeigten null Punkte, aber jede andere Altersgruppe zeigte gar nichts. Aber das ist nicht der Fall.

Es gibt keine 88 Jahre alten asiatischen Männer in der Bevölkerung, also gibt es eine Null in der Kategorie. Es gibt auch keine 88-jährigen "anderen" Männer in der Bevölkerung, aber sie tauchen überhaupt nicht auf.

EDIT: Ich fügte den Code hinzu, der zeigt, wie ich die Gruppe nach Objekt in Pandas mache und wie ich summiere, um die Zählungen in jeder Gruppe zu finden.

Antwort

4

Verwenden reindex mit einem vordefinierten Index und fill_value=0

ages = np.arange(21, 26) 
genders = ['male', 'female'] 
races = ['white', 'black', 'hispanic', 'asian', 'other'] 

sim_size = 10000 

midx = pd.MultiIndex.from_product([ 
     ages, 
     genders, 
     races 
    ], names=['Age', 'Gender', 'Race']) 

sim_df = pd.DataFrame({ 
     # I use [1:-1] to explicitly skip some age groups 
     'Age': np.random.choice(ages[1:-1], sim_size), 
     'Gender': np.random.choice(genders, sim_size), 
     'Race': np.random.choice(races, sim_size) 
    }) 

Diese haben fehlende Altersgruppen

counts = sim_df.groupby(sim_df.columns.tolist()).size() 
counts.unstack() 

enter image description here

Dieses füllt fehlende Altersgruppen

counts.reindex(midx, fill_value=0).unstack() 

enter image description here

+0

Dank! Das hat funktioniert! Gibt es eine Möglichkeit, den Ausgang 1D zu machen? Ich möchte nur eine Spalte von Zählungen sehen. –

+0

Haben Sie auch eine Ahnung, warum die Nullen nur manchmal auftauchen? Und die "nullzähligen" Untergruppen der Bevölkerung würden irgendwann überhaupt nicht auftauchen? –

+0

Und ich mag, wie Sie das Bild durch einen imgur Link gepostet haben. Ich habe die "Bearbeiten" -Funktion geöffnet, um zu sehen, wie Sie es gemacht haben. Sehr cool. –

Verwandte Themen